使用tcl glob进行通配符搜索

时间:2020-05-17 08:29:45

标签: tcl wildcard glob

我正在尝试在子目录中搜索目录,并返回与通配符glob搜索匹配的所有目录。

文件夹结构如下所示...

Rootdir
 -dir01
   -dir_match_01-OLD
   -dir_match_01
 -dir02
   -dir_match_02-OLD
   -dir_match_02
 -dir03
   -dir_match_03-OLD
   -dir_match_03
 -...

我正在搜索驻留在dir01,dir02,dir03等目录中。

我正在使用以下glob调用以递归方式搜索目录,该目录似乎正常工作...

set rootdir "/home/rootdir/"
set searchstring "*-OLD"

foreach dir [glob -nocomplain -dir $rootdir -type d -- *] {
  set result [glob -nocomplain -dir $dir -type d -- $searchstring]
  puts $result
}

我发现的是,如果我没有在$searchstring中使用通配符,而是使用存在的确切目录名称,那么我将成功接收到输出。但是,如果我随后使用通配符搜索以*-OLD结尾的所有目录,它将成功找到它们并把它们放到同一行。

/home/rootdir/dir01/directory01-OLD /home/rootdir/dir01/directory02-OLD /home/rootdir/dir01/directory03-OLD

我试图通过使用regsub将空格替换为\ n来分隔条目,但是它所做的就是删除空格...

/home/rootdir/dir01/directory01-OLD/home/rootdir/dir01/directory02-OLD/home/rootdir/dir01/directory03-OLD

对于我做错的任何建议,将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

最明显的部分是glob 总是返回名称列表。因此,您需要像这样进行最内部的循环:

foreach dir [glob -nocomplain -dir $rootdir -type d -- *] {
    foreach result [glob -nocomplain -dir $dir -type d -- $searchstring] {
        puts $result
    }
}

但是,对于固定深度搜索,我认为您可以这样做:

foreach dir [glob -nocomplain -dir $rootdir -type d -- */$searchstring] {
    puts $dir
}

如果需要递归(全目录树)搜索,则Tcllib的fileutil package中包含实用程序命令:

package require fileutil

proc myMatcher {pattern filename} {
    # Does the filename match the pattern, and is it a directory?
    expr {[string match $pattern $filename] && [file isdir $filename]}
}

set rootdir "/home/rootdir/"
set searchstring "*-OLD"

# Note the use of [list] to create a partial command application
# This is a standard Tcl technique; it's one of the things that [list] is designed to do
foreach dir [fileutil::find $rootdir [list myMatcher $searchstring]] {
    puts $dir
}