tcl - 使用 glob 将变量设置为文件名
问题描述
我有一个目录,其中包含另一个名为ABC_<version number>
我想将我的路径设置ABC_<version number>
为(在模块文件中)
如何在 TCL 中使用 glob 获取我想要的目录名称并将其放入 TCL 变量中?
谢谢!
解决方案
该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
in的使用glob
。那是一种类型 filter,在这种情况下非常有用,因为您明确地只想取回目录名称。另一个主要有用的选项(通常)是-type f
只获取真实文件。
推荐阅读
- angular - 如何在 Angular 6 中创建抖动动画?
- algorithm - 是否可以在恒定时间内在集合中找到随机元素?
- c# - StartIndex 不能小于零。参数名称:startIndex 使用 HijriDatePicker?
- node.js - 为什么开发和生产中 hexo 的文件夹结构不同?
- django-rest-framework - 自定义 ModelViewSet 以指向 Get 和 Patch 的相同 URL
- r - 循环中生成的 insertUI 中的 observeEvent
- pyspark - Pyspark:执行器服务器上的 python 包
- java - Android,Picasso - 大多数图像都不想加载(Kotlin)
- laravel-5 - 为什么我在 laravel 5.5 项目中有不支持的 fsevents 错误平台
- perl - 当 xmlns 存在时,XML::LibXML findnodes() 不返回结果