如何让TCL的glob命令支持目录通配符或用find命令实现文件查找?
在TCL中处理带通配符的目录路径查找.log文件
方法一:使用TCL的glob命令分步处理
glob的-directory参数要求传入实际存在的具体目录,无法直接识别路径中的*通配符。因此需要先展开符合模式的目录,再在每个目录内查找目标文件:
set dir_pattern "/home/user/output/*/logs/" # 先匹配所有符合模式的目录 set target_dirs [glob -nocomplain -type d $dir_pattern] if {[llength $target_dirs] > 0} { set log_files [list] foreach dir $target_dirs { # 在每个目录下查找.log文件,合并结果 lappend log_files {*}[glob -nocomplain -directory $dir *.log] } foreach log_file $log_files { puts $log_file } }
方法二:通过exec调用find命令并正确处理通配符
直接传入带*的路径给find时,TCL不会自动展开通配符,导致shell将*视为字面量报错,可通过两种方式解决:
方式1:让shell自动展开通配符
调用shell处理路径中的通配符,同时给*.log加单引号避免shell提前匹配:
set dir_pattern "/home/user/output/*/logs/" # 借助sh -c让shell解析路径中的* set log_files [exec sh -c "find $dir_pattern -name '*.log'"] # 按换行分割结果并输出 foreach log_file [split $log_files \n] { if {$log_file ne ""} { puts $log_file } }
方式2:使用find原生的路径匹配
跳过shell通配符处理,直接用find的-path参数匹配路径模式,更适配含空格的路径:
# 指定根目录,用-path匹配包含/logs/且以.log结尾的文件 set log_files [exec find /home/user/output -path "*/logs/*.log"] foreach log_file [split $log_files \n] { if {$log_file ne ""} { puts $log_file } }
内容的提问来源于stack exchange,提问作者A.G.Progm.Enthusiast
相关产品推荐
相关产品推荐

