请帮助我输出包含子目录中文件名及其内存字节的文件的脚本,程序的争论是文件夹路径。输出文件应该是第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
答案 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的建议之外,还有更多用于递归获取文件的工具:
recursive_glob
(来自Tclx包)和for_recursive_glob
(也来自Tclx)fileutil::findByPattern
(来自fileutil包)以下是如何使用for_recursive_glob
:
package require Tclx
for_recursive_glob filename {../design_data} {*} {
puts $filename
}
这个建议与Donal一起应该足以让您创建一个完整的解决方案。祝你好运。
for_recursive_glob
命令有4个参数:
{/dir1 /dir2 /dir3}
){*.txt *.c *.cpp}
)for_recursive_glob
无法处理您没有权限的目录(即在Mac,Linux和BSD平台上,我不了解Windows)。在这种情况下,除非catch
例外,否则脚本将崩溃。recursive_glob
命令类似,但它返回文件名列表,而不是for循环中的结构。