如何在 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)