删除TCL中除部分文件以外的所有文件

删除TCL中除部分文件以外的所有文件,tcl,Tcl,我需要一个小脚本来清理所有文件和目录,除了在某个目录(模块)的两个级别中的一些文件和目录 我正在尝试让以下TCL代码正常工作: proc add_module {module} { # Clean up old source IP-catalogs set clean_list [glob -nocomplain ${repo_dir}/src/pl/${module}/semi_top/*/*] set clean_exception_xci ${repo_dir}/s

我需要一个小脚本来清理所有文件和目录,除了在某个目录(模块)的两个级别中的一些文件和目录

我正在尝试让以下TCL代码正常工作:

proc add_module {module} {
    # Clean up old source IP-catalogs
    set clean_list [glob -nocomplain ${repo_dir}/src/pl/${module}/semi_top/*/*]
    set clean_exception_xci ${repo_dir}/src/pl/${module}/semi_top/*/*.xci
    set clean_exception_prj ${repo_dir}/src/pl/${module}/semi_top/*/*.prj
    foreach clean_file ${clean_list} {
        if {{$clean_file} ne {$clean_exception_xci}} and {{$clean_file} ne {$clean_exception_prj}} {
            file delete -nocomplain $clean_file
        }
    }
}
但我得到了以下错误:

invalid bareword "clean_file"
in expression "clean_file ne clean_exception_xci";
should be "$clean_file" or "{clean_file}" or "clean_file(...)" or ...
    (parsing expression "clean_file ne clean_ex...")
    invoked from within
"if {clean_file ne clean_exception_xci} and {clean_file ne clean_exception_prj} {
        file delete -nocomplain clean_file
    }"
    ("foreach" body line 2)
    invoked from within
"foreach clean_file ${clean_list} {
    if {clean_file ne clean_exception_xci} and {clean_file ne clean_exception_prj} {
        file delete -nocomplain clea..."
    (procedure "add_module" line 37)
    invoked from within
谁能告诉我可能发生了什么事?(我认为代码只处理文件,而不是目录。可能还需要添加一些内容来处理目录…)


谢谢/泰迪

问题在于这一行:

if {{$clean_file} ne {$clean_exception_xci}} and {{$clean_file} ne {$clean_exception_prj}} {
您需要使用
string match
来确定字符串是否匹配glob模式,而不是
ne
运算符(它会对精确的字符串比较求反)。您还需要使用正确数量的大括号;你有太多了!此外,
根本不是Tcl中的操作员

我认为这是正确的做法:

if {![string match $clean_exception_xci $clean_file] && ![string match $clean_exception_prj $clean_file]} {
然而,我更喜欢使用更短的行和
继续
;我认为这会产生更干净的代码

foreach file $clean_list {
    if {[string match $clean_exception_xci $file]} {
        continue
    }
    if {[string match $clean_exception_prj $file]} {
        continue
    }
    file delete -nocomplain $file
}
它更长,但更清楚(对我来说),我们正在应用两个过滤操作。

最终代码:

set clean_list [glob -nocomplain ${repo_dir}/src/pl/${module}/ip_catalog/*/*]
set clean_exception_xci_list [glob -nocomplain ${repo_dir}/src/pl/${module}/ip_catalog/*/*.xci]
set clean_exception_prj_list [glob -nocomplain ${repo_dir}/src/pl/${module}/ip_catalog/*/*.prj]

foreach file $clean_list {
    set _break 0

    foreach except_file_xci $clean_exception_xci_list {
        if {[string match $except_file_xci $file]} {
        incr _break
        break
        }
    }

    foreach except_file_prj $clean_exception_prj_list {
        if {[string match $except_file_prj $file]} {
        incr _break
        break
        }
    }
    if {$_break > 0} continue
    file delete -force $file
}
工作起来很有魅力。我想使用“ni”命令也可以。除了内部foreach循环之外,还应该能够使用以下内容:

if {[string match $file ni $clean_exception_xci_list]} {
    continue
}

但是我很高兴:)谢谢

为什么在这里使用
?您打算使用逻辑AND吗?那么应该是
&&&
。我希望代码修饰师不要坚持对每种语言都应用C风格的注释。您好。谢谢你的帮助。我认为删除部分现在可以正常工作了,但是我刚刚意识到还有另一个问题。“clean_exception_xci”(和“_prj”)不仅仅是一个文件,它实际上是一个文件列表。我将集合行更改为:
set clean\u exception\u xci[glob-nocomplain${repo\u dir}/src/pl/${module}/ip\u catalog/*/*/*.xci]
set clean\u exception\u prj[glob-nocomplain${repo\u dir}/src/pl/${module module}/ip\u catalog/*/*.prj]
在进行字符串匹配时,您会使用嵌套的foreach循环解决这个问题吗?(很抱歉格式不好…)啊。如果您有实际文件的列表,则可以使用
ni
操作符。