2014-03-24 46 views
1

請幫助我輸出包含子目錄中文件名及其內存字節的文件的腳本,程序是.OUTPUT文件的文件夾路徑應在第一列的文件名及其在第二列存儲TCL腳本輸出一個包含directry和子目錄中所有文件大小的文件

注意:文件夾包含子文件夾...裏面的子文件夾有文件

。我試過這樣

set fp [open files_memory.txt w] 
set file_names [glob ../design_data/*/*] 
foreach file $file_names { 
     puts $fp "$file [lindex [exec du -sh $file] 0]" 
} 
close $fp 

結果sam PLE:

../design_data/def/ip2.def.gz 170M 
../design_data/lef/tsmc13_10_5d.lef  7.1M 

,但我想只有文件名要打印的是ip2.def.gz,tsmc13_10_5d.lef ..等(不entirepath)和文件memorry應該對齊

TCL

+0

你試過什麼了嗎? (PS:StackOverflow不是代碼寫入服務站點)提示:['glob'](https://www.tcl.tk/man/tcl/TclCmd/glob.htm)獲取文件名,['file']( http://www.tcl.tk/man/tcl8.4/TclCmd/file.htm)來獲得大小。 – Jerry

回答

1

fileutil Tcllib中的程序包定義了可遞歸列出目錄內容的命令fileutil::find。然後,您可以使用foreach遍歷列表,並獲得他們每個人的尺寸與file size,生產具有puts輸出之前,也許是這樣的:

puts "$filename\t$size" 

$filename是該文件的名稱和$size是多大。您將更早獲得這些值(即,之前的一兩行!)。中間的\t變成了TAB字符。替換爲空格或逗號或幾乎任何你喜歡的東西;你的來電。


只獲取文件名的最後一部分,我會做:

puts $fp "[file tail $file] [file size $file]" 

這確實用的東西有關文件的大小,而不是縮寫形式的完整信息,所以如果你真的想要4k而不是4096,繼續使用那個(慢)咒語與exec du。 (如果消費者是一個程序,或程序員,完全寫出來的尺寸可能會更好。)

+0

不,我們不會給你更多的細節,因爲我們不是「爲你寫代碼」服務。 –

0

除了多納爾的建議,也有遞歸獲取文件更多的工具:

這裏是如何使用for_recursive_glob一個例子:

package require Tclx 

for_recursive_glob filename {../design_data} {*} { 
    puts $filename 
} 

這一建議,與敦爾的組合應該足以爲您打造一個完整的解決方案。祝你好運。

討論

  • for_recursive_glob命令採用4個參數:
    1. 變量的代表來搜索(例如{/dir1 /dir2 /dir3}
    2. A中的完整路徑名
    3. 目錄的列表的名稱要搜索的模式列表(例如​​3210)
    4. 最後,for循環的主體,其中y你想用文件名做一些事情。
  • 根據我的經驗,for_recursive_glob無法處理你沒有權限(即在Mac,Linux和BSD平臺,我不知道有關Windows)目錄。在這種情況下,腳本將崩潰,除非您的例外情況爲catch
  • recursive_glob命令是類似的,但它返回一個文件名列表,而不是在for循環中構造。
相關問題