2017-04-25 67 views
0

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

會給你帶有dir c及其子目錄的所有文件。

現在考慮一個案例,我想排除幾個目錄下c說dir1和dir2是兩個目錄,我想排除目錄dir2。請指導我如何繼續進行。 set exclude_dir dir2

回答

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}] {}] 
+0

它更地道使用'如果{$ DIR妮$ exclud_dirs_list} { '用於目錄包含測試('ni'用於Not In),但效果是一樣的。 –

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或正則表達式匹配可以改進目錄名稱的匹配。

文檔: foreachglobiflappendni (operator)procreturnset{*} (syntax)

相關問題