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

TCL-用于输出包含目录和子目录中所有文件大小的文件的脚本,tcl,Tcl,请帮助我使用脚本输出文件,该文件包含子目录中的文件名及其内存(字节),程序的参数是文件夹路径。输出文件应为第一列中的文件名,第二列中的内存 注意:文件夹包含子文件夹…子文件夹中有文件 .我试过这样做 set fp [open files_memory.txt w] set file_names [glob ../design_data/*/*] foreach file $file_names { puts $fp "$file [lindex [exec du -sh $

请帮助我使用脚本输出文件,该文件包含子目录中的文件名及其内存(字节),程序的参数是文件夹路径。输出文件应为第一列中的文件名,第二列中的内存

注意:文件夹包含子文件夹…子文件夹中有文件

.我试过这样做

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(而不是entirepath),并且文件内存应该对齐


TCL

Tcllib中的fileutil包定义了命令,该命令可以递归地列出目录的内容。然后,您可以使用
foreach
对列表进行迭代,并使用
file size
获取每个列表的大小,然后使用
put
生成输出,可能如下所示:

puts "$filename\t$size"
$filename
是文件名,
$size
是文件的大小。您将更早地获得这些值(即,在前面的一两行中!)。中间的<代码> \t/COD>被转换为制表符。替换为空格、逗号或任何你喜欢的东西;你的电话


要仅获取文件名的最后一部分,我将执行以下操作:

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

这包含了有关文件大小的完整信息,而不是缩写形式,因此如果您确实想要
4k
而不是
4096
,请继续使用
exec du
的(慢速)咒语。(如果消费者是一个程序或程序员,完整写出大小可能更好。)

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

  • (来自Tclx包)和
  • (也来自Tclx)
  • (来自fileutil包)
下面是一个如何使用
进行全局递归的示例:

package require Tclx

for_recursive_glob filename {../design_data} {*} {
    puts $filename
}
这个建议,加上Donal的建议,应该足以让您创建一个完整的解决方案。祝你好运

讨论
  • expndtw-1\u recursive\u glob的
    命令包含4个参数:
    
  • 表示完整路径名的变量的名称
  • 要搜索的目录列表(例如
    {/dir1/dir2/dir3}
  • 要搜索的模式列表(例如,
    {*.txt*.c*.cpp}
  • 最后,是for循环的主体,您希望在其中对文件名执行一些操作
  • 根据我的经验,
    for_recursive_glob
    无法处理您无权访问的目录(即,在Mac、Linux和BSD平台上,我不了解Windows)。在这种情况下,除非捕获异常,否则脚本将崩溃
  • recursive\u glob
    命令类似,但它返回一个文件名列表,而不是在for循环中结构化

你试过什么了吗?(PS:StackOverflow不是一个代码编写服务网站)提示:要获取文件名,获取大小。不,我们不会给你更多的细节,除非你先展示你尝试了什么,因为我们不是“为你编写代码”服务。