File io 将中的临时文件连接到tcl中的单个文件

File io 将中的临时文件连接到tcl中的单个文件,file-io,tcl,concatenation,File Io,Tcl,Concatenation,我正在尝试将文件夹中的所有临时文件连接到单个文本文件中。但我总是遇到错误: if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] } 错误消息: -cat: /tmp/new_temp/*: No such file or directory 如果我在tclsh上尝试同样的方法(没有catch和exec),它会工作,因为Tcl不是shell,它不会自动扩展glob模式。试一试 if { [catc

我正在尝试将文件夹中的所有临时文件连接到单个文本文件中。但我总是遇到错误:

 if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] }
错误消息:

-cat: /tmp/new_temp/*: No such file or directory

如果我在tclsh上尝试同样的方法(没有catch和exec),它会工作

,因为Tcl不是shell,它不会自动扩展glob模式。试一试

if { [catch {exec sh -c {cat /tmp/new_temp/* >> /tmp/full_temp.txt}} msg] }
要让Tcl进行文件名扩展,需要使用
glob
命令

set code [catch [list exec cat {*}[glob /tmp/new_temp/*] >> /tmp/full_temp.txt] msg]
if {$code != 0} {
    # handle error
}

为什么会有如此糟糕的做法?使用Tcl本身连接这些文件:

set out [open /tmp/full_temp.txt w]
fconfigure $out -translation binary
foreach fname [glob -nocomplain -type f "/tmp/new_temp/*"] {
    set in [open $fname]
    fconfigure $in -translation binary
    fcopy $in $out
    close $in
}
close $out

第二个示例不正确,因为它忽略了
cat
本身。我还要强调的是,在这种情况下,
glob
的默认行为(如果没有匹配的文件就会爆炸)实际上是正确的,否则
cat
将尝试读取进程的
stdin
。我的意思是,通常建议将
-nocomplain
传递给
glob
,但这种情况不同。oops忽略了它。我又踢了一脚,glob的-type参数在这里应该做什么?当我将(/bad参数添加到“-types”:-f)时,我得到了一个错误,如果我从匹配的所有内容中删除“-typef”@egorulz,它似乎工作得很好。否则,您需要对每个匹配的条目执行
file stat
,看看它是否真的是文件,而不是目录、套接字或fifo。这是必需的,因为尝试
fcopy
目录将失败并出现错误,而尝试使用套接字或fifo执行此操作可能只是尝试从它们读取数据,这可能是错误的)。请注意,您最初使用
cat
的尝试也容易出现同样的问题。@egorulz,当然,如果您确信自己完全控制了
/tmp/new_temp
的内容,您可以在不检查的情况下继续,但至少您应该意识到潜在的问题。对我的第一个评论进行了更正:对于目录来说,
open
将失败,而不是
fcopy
@egorulz,至于为什么传递
glob
类型的
-types
swich会给你一个错误——你可能有像旧的一样脏的Tcl,比如8.4之前的版本或者更旧的版本。就个人而言,我甚至不记得
glob
不支持此选项的时间。或者您可能有一些非标准的Tcl构建(?)@kostix,谢谢您的解释。我使用的是8.4版,这可能就是为什么它会出现这个错误。是的,这是史前的,我知道,更新的版本会帮助我开始处理线程和其他东西。我正在创建有问题的临时文件夹,并在每次运行后将其删除,以便其中不会有任何意外的文件夹。