2012-12-21 47 views
1

我試圖將文件夾中的所有臨時文件連接到單個文本文件中。但我一直在錯誤運行:將臨時文件連接到tcl中的單個文件

if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] } 

錯誤消息:

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

如果我嘗試在tclsh的同樣的事情(不捕,和exec)它的工作原理

回答

5

爲什麼這麼可怕的做法?使用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 
+0

+1 fcopy會非常快。 –

+0

glob應該在這裏做的參數是什麼?我收到一個錯誤(/壞參數「-types」:-f) 它似乎工作正常,如果我刪除「-type f」 – egorulz

+0

@egorulz,[它只選擇文件](http: //www.tcl.tk/man/tcl8.4/TclCmd/glob.htm#M10)。否則,你需要在每個匹配條目上執行'file stat',看看它是否真的是一個文件,而不是一個目錄或套接字或fifo。這是必需的,因爲試圖對一個目錄執行fcopy操作會失敗並出現錯誤,並嘗試使用套接字或fifo執行此操作可能只是嘗試從它們讀取數據,而這些數據本來就是錯誤的)。請注意,您使用'cat'的原始嘗試很容易出現同樣的問題。 – kostix

2

,因爲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 
} 
+0

第二個示例是錯誤的,因爲它錯過了'cat'本身。我還會強調,這種情況是*罕見的*其中'glob'的默認行爲 - 如果沒有匹配的文件就炸掉 - 實際上是正確的,否則'cat'會試圖從流程中讀取'stdin'。我的意思是,通常將'-nocomplain'傳遞給'glob'是可取的,但這種情況是不同的。 – kostix

+0

哎呀錯過了。我再拍一腳貓 –