我需要一个小脚本来清除所有文件和目录,除了在某个目录(模块)中的两个级别以外的一些文件和目录。
我正在尝试使用以下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
有人可以告诉我一些可能发生的事情吗? (我认为代码只处理文件,而不是目录。可能还需要添加一些来处理目录......)
谢谢! /泰迪熊
答案 0 :(得分:2)
问题在于这一行:
if {{$clean_file} ne {$clean_exception_xci}} and {{$clean_file} ne {$clean_exception_prj}} {
您需要使用string match
来确定字符串是否与glob模式匹配,而不是ne
运算符(它确实否定了完全的字符串比较)。你还需要使用正确数量的牙箍;你有太多了!此外,and
根本不是Tcl中的运算符。
我认为这是正确的方法:
if {![string match $clean_exception_xci $clean_file] && ![string match $clean_exception_prj $clean_file]} {
然而,我会更乐意使用较短的行和continue
;我认为这会产生更清晰的代码。
foreach file $clean_list {
if {[string match $clean_exception_xci $file]} {
continue
}
if {[string match $clean_exception_prj $file]} {
continue
}
file delete -nocomplain $file
}
我们应用两个过滤操作的时间更长,但更清楚(对我而言)。
答案 1 :(得分:0)
最终代码:
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
}
等。但我很高兴:)谢谢!