TCL脚本,用于输出包含directry和子目录中所有文件大小的文件

时间:2014-03-24 11:12:40

标签: tcl

请帮助我输出包含子目录中文件名及其内存字节的文件的脚本,程序的争论是文件夹路径。输出文件应该是第1列中的文件名及其内存中的第二栏

注意:文件夹包含子文件夹...在子文件夹中有文件

。我试过这种方式

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

结果样本:

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

但是我想只打印文件名,即ip2.def.gz,tsmc13_10_5d.lef ..etc(不是整个路径),文件记忆应该对齐

TCL

2 个答案:

答案 0 :(得分:1)

Tcllib中的 fileutil 包定义了命令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的那个(慢)咒语}。 (如果消费者是程序或程序员,那么写出完整的大小可能会更好。)

答案 1 :(得分:0)

除了Donal的建议之外,还有更多用于递归获取文件的工具:

以下是如何使用for_recursive_glob

的示例
package require Tclx

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

这个建议与Donal一起应该足以让您创建一个完整的解决方案。祝你好运。

讨论

  • for_recursive_glob命令有4个参数:
    1. 表示完整路径名的变量名称
    2. 要搜索的目录列表(例如{/dir1 /dir2 /dir3}
    3. 要搜索的模式列表(例如{*.txt *.c *.cpp}
    4. 最后,for循环的主体,你想用文件名做什么。
  • 根据我的经验,for_recursive_glob无法处理您没有权限的目录(即在Mac,Linux和BSD平台上,我不了解Windows)。在这种情况下,除非catch例外,否则脚本将崩溃。
  • recursive_glob命令类似,但它返回文件名列表,而不是for循环中的结构。