作者 主題: tcl 的file exists 如何接受萬用符號"*"  (閱讀 6838 次)

0 會員 與 1 訪客 正在閱讀本文。

comochen

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
各位學長好
初次接觸tcl,還請學長多多指點
若我想要搜尋aaa 和bbb兩個目錄下有沒有*.dat檔
若我用
if {[file exists "/data/aaa/*.dat"] == 1 || [file exists "/data/bbb/*.dat"] == 1 } {
 puts "file exists!";
}
目錄裡面有111.dat 和 222.dat檔,但是都不會顯示  file exists!
若我指定已存在的檔案名稱111.dat 和 222.dat
if {[file exists "/data/aaa/111.dat"] == 1 || [file exists "/data/bbb/222.dat"] == 1 } {
 puts "file exists!";
}
就會顯示file exists!
看起來好像是萬用符號不被接受
有什麼方法可以讓他認得萬用符號"*"呢?

謝謝

特級大肉腳

  • 憂鬱的高中生
  • ***
  • 文章數: 113
    • 檢視個人資料
回覆: tcl 的file exists 如何接受萬用符號"*"
« 回覆 #1 於: 2011-01-14 17:59 »
tcl中的萬用字元可用glob來執行:例如glob ls *.dat,如果要陸續執行一個列表元素要用eval。
但是你目前想要做的事剛好不適合用glob或eval。file exists後面是接單個檔案,不能接一堆檔案或列表元素,用eval也沒辦法。
但是可以這樣寫:(用跑迴圈的方式,將一個個檔案讀入,並用string range來比對字尾(副檔名)),以下是抓.tcl或.sh的例子。
set a [exec ls]
set b [llength $a]
for { set i 0 } { $i<$b } { incr i } {
set c [lindex $a $i]
if { [string range $c end-3 end]==".tcl" || [string range $c end-2 end]==".sh" }
 { puts "檔案存在"; break }
}