使用glob将变量设置为文件名

时间:2019-02-25 16:36:19

标签: tcl glob

我有一个目录,其中包含另一个名为ABC_<version number>

的目录

我想将路径设置为ABC_<version number>(在模块文件中)的任何位置

如何在TCL中使用glob获取所需目录的名称并将其放入TCL变量中?

谢谢!

2 个答案:

答案 0 :(得分:1)

glob命令可扩展通配符,但会生成所有匹配项的Tcl列表,因此您需要注意一点。而且,列表的顺序是“随机的”-它取决于操作系统目录结构中条目的原始顺序,通常这不容易预测,因此您确实需要确定所需的内容。另外,如果您只希望列表中的单个项目,则必须使用lindex(或在退化操作模式下使用lassign)将其选中:否则,您的代码将当遇到一个在路径名中放入特殊字符(空格或其他字符之一的用户)时,它会爆炸。从一开始就是安全的。

例如,如果您只想匹配一个元素,否则就出错了,您应该这样做:

set thePaths [glob -directory $theDir -type d ABC_*]
if {[llength $thePaths] != 1} {
    error "ambiguous match for ABC_* in $theDir"
}
set theDir [lindex $thePaths 0]

如果您想按版本号排序并选择(大概是)最新消息,则可以使用lsort -dictionary。在内部,这是非常神奇的(严重的;如果您想了解它的真正作用,请阅读文档),但是在所有理智的版本号方案中都做对了。

set thePaths [glob -directory $theDir -type d ABC_*]
set theSortedPaths [lsort -dictionary -decreasing $thePaths]
set theDir [lindex $theSortedPaths 0]

理论上,您可以按目录上的实际日期进行自定义排序,但这更为复杂,有时在进行系统维护时可能会感到惊讶。


请注意在-type d中使用glob。这是一个类型过滤器,在这种情况下非常有用,在这种情况下,您明确地只想找回目录名称。通常,那里的另一个主要有用选项是-type f,仅获取真实文件。

答案 1 :(得分:0)

结果是:

var foodsToDelete = db.Foods.Where(_ => _.Cart.UID == id).ToList();
db.Foods.RemoveRange(foodsToDelete);
db.SaveChanges();

无需在路径两边加上引号。 set abc_path [glob -directory $env(RELDIR) ABC_*] 所在的位置。

稍后在模块文件中

-directory controls