删除TCL以外的所有文件

时间:2015-09-29 11:32:16

标签: 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}/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

有人可以告诉我一些可能发生的事情吗? (我认为代码只处理文件,而不是目录。可能还需要添加一些来处理目录......)

谢谢! /泰迪熊

2 个答案:

答案 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
}

等。但我很高兴:)谢谢!