删除TCL中除部分文件以外的所有文件
我需要一个小脚本来清理所有文件和目录,除了在某个目录(模块)的两个级别中的一些文件和目录 我正在尝试让以下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
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
操作符。