我有一个目录,其中包含另一个名为ABC_<version number>
我想将路径设置为ABC_<version number>
(在模块文件中)的任何位置
如何在TCL中使用glob获取所需目录的名称并将其放入TCL变量中?
谢谢!
答案 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