如何使用 tcl 搜索仅包含部分文件名的文件

How can I search for a file using tcl, with only part of the file name

如果我有一个包含以下文件的文件夹:

hello-version-1-090.txt
hello-awesome-well-091.txt
goodday-087.txt
hellooo-874.txt
hello_476.txt
hello_094.txt

我如何使用 tcl 搜索包含术语 'hello' 和 '091' 的文件。

可能的解决方案: 在文件夹中获取 ls -l 的输出,用 '\n' 拆分它,然后在每一行上 运行ning 一个 foreach 并使用正则表达式来匹配条件。但是我如何在文件夹中 运行 一个 ls -l 并使用 tcl 记录其保存内容(文件名)?

使用glob,您可以应用该模式并获得符合我们条件的文件名列表。

puts [ exec ls -l ]; #Just printing the 'ls -l' output
set myfiles [ glob -nocomplain hello*091*.txt ]
if {[llength $myfiles]!=0} {
    puts "Following files matched your pattern : "
    foreach fname $myfiles {
        puts $fname
    }
} else {
    puts "No files matched your pattern"
} 

使用 -nocomplain 的原因是如果没有与我们的搜索模式匹配的文件,则允许返回一个空列表而不会出错。

输出

sh-4.2# tclsh main.tcl                                                                                                         
total 4                                                                                                                        
-rw-r--r-- 1 root root   0 Mar  4 15:23 goodday-087.txt                                                                        
-rw-r--r-- 1 root root   0 Mar  4 15:23 hello-awesome-well-091.txt                                                             
-rw-r--r-- 1 root root   0 Mar  4 15:23 hello-version-1-090.txt                                                                
-rw-r--r-- 1 root root   0 Mar  4 15:23 hello_094.txt                                                                          
-rw-r--r-- 1 root root   0 Mar  4 15:23 hello_476.txt                                                                          
-rw-r--r-- 1 root root   0 Mar  4 15:23 hellooo-874.txt                                                                        
-rw-r--r-- 1 root root 262 Mar  4 15:24 main.tcl                                                                               
Following files matched your pattern :                                                                                         
hello-awesome-well-091.txt                                                                                                     

顺便说一句,关于如何保存 ls -l 输出的查询,只需将输出保存到一个变量即可。

set result [ exec ls -l ]

然后使用 result 变量,您可以像您提到的那样逐行循环应用 regexp

但是,我希望使用 glob 会是更好的方法。

参考:glob