首页 > 解决方案 > 使用 glob 将变量设置为文件名

问题描述

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

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

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

谢谢!

标签: tclglob

解决方案


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 din的使用glob。那是一种类型 filter,在这种情况下非常有用,因为您明确地只想取回目录名称。另一个主要有用的选项(通常)是-type f只获取真实文件。


推荐阅读