如果我有一个包含以下文件的文件夹:
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记录其保存内容(文件名)?
答案 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