我是tcl的初学者。
我能够编写脚本来收集目录下的所有文件,并且它是所有子目录。
我为此写了一个belwo proc。
proc rglob { dirpath } {
set rlist ""
foreach fpath [glob -nocomplain -types f -directory ${dirpath} *] {
lappend rlist ${fpath}
}
foreach dir [glob -nocomplain -types d -directory ${dirpath} *] {
lappend rlist {*}[rglob ${dir}]
}
return ${rlist}
}
rglob /a/b/c
将为您提供包含dir c及其子目录的所有文件。
现在考虑一个案例我想在c下排除几个目录,说dir1和dir2是两个目录,我想要排除目录dir2。请指导我如何继续这样做。
set exclude_dir dir2
答案 0 :(得分:1)
此代码与接受的答案基本相同,但稍微简单一点:
proc rglob {dirpath args} {
set exclude $args
set rlist [glob -nocomplain -types f -directory $dirpath *]
foreach dir [glob -nocomplain -types d -directory $dirpath *] {
if {$dir ni $exclude} {
lappend rlist {*}[rglob $dir {*}$exclude]
}
}
return $rlist
}
用法: rglob dirpath ?arg arg ...?
,例如rglob .
,rglob . ./abc ./def
。
使用glob或regexp匹配可以改善目录名的匹配。
文档: foreach, glob, if, lappend, ni (operator), proc, return, set, {*} (syntax)
答案 1 :(得分:0)
这将从搜索结果中排除名称在exclude_dirs_list中的所有目录。实际上,名称不是完整路径,因此不仅会排除/ a / b / c / dir1,还会排除/ a / b / c / d / e / dir1。
proc rglob { dirpath exclude_dirs_list} {
set rlist ""
foreach fpath [glob -nocomplain -tails -types f -directory ${dirpath} *] {
lappend rlist [file join ${dirpath} ${fpath}]
}
foreach dir [glob -nocomplain -tails -types d -directory ${dirpath} *] {
if {[lsearch -exact $exclude_dirs_list $dir] == -1} {
lappend rlist {*}[rglob [file join ${dirpath} ${dir}] $exclude_dirs_list]
}
}
return ${rlist}
}
rglob /a/b/c [list dir1 dir2]
如果您只需要排除/ a / b / c / dir1,您应该从
更改lappend rlist {*}[rglob [file join ${dirpath} ${dir}] $exclude_dirs_list]
到
lappend rlist {*}[rglob [file join ${dirpath} ${dir}] {}]