如何在tcl中排除该目录下的特定目录和所有文件

时间:2017-04-25 12:21:51

标签: tcl glob

我是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

2 个答案:

答案 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匹配可以改善目录名的匹配。

文档: foreachglobiflappendni (operator)procreturnset{*} (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}] {}]