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版,这可能就是为什么它会出现这个错误。是的,这是史前的,我知道,更新的版本会帮助我开始处理线程和其他东西。我正在创建有问题的临时文件夹,并在每次运行后将其删除,以便其中不会有任何意外的文件夹。