如何使用tcl搜索文件,只有部分文件名

时间:2015-03-04 14:59:18

标签: regex bash foreach tcl ls

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

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

如何搜索具有以下内容的文件:' hello'和' 091'在其中使用tcl。

可能的解决方案: 获取文件夹中ls -l的输出,将其与'\n'分开,然后在每一行上运行foreach并使用regexp匹配条件。但是如何在文件夹中运行ls -l并使用tcl记录其保存内容(文件名)?

1 个答案:

答案 0 :(得分:4)

使用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