如何在 tcl 中排除特定目录和该目录下的所有文件
How to exclude particular directory and all files under that directory in tcl
我是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
将为您提供目录 c 及其子目录中的所有文件。
现在考虑一个案例,我想排除c下的几个目录,说dir1和dir2是两个目录,我想排除一个目录dir2。请指导我如何进行相同的操作。
set exclude_dir dir2
这将从搜索结果中排除名称在 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}] {}]
此代码与接受的答案中的代码基本相同,但更简单一些:
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)
我是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
将为您提供目录 c 及其子目录中的所有文件。
现在考虑一个案例,我想排除c下的几个目录,说dir1和dir2是两个目录,我想排除一个目录dir2。请指导我如何进行相同的操作。
set exclude_dir dir2
这将从搜索结果中排除名称在 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}] {}]
此代码与接受的答案中的代码基本相同,但更简单一些:
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)