tcl/tk詳解——glob使用例解

Augusdi發表於2015-12-15

名稱
glob - 返回模式匹配的檔名

語法
glob ?switches? pattern ?pattern ...?


描述
 這個命令返回一個匹配pattern變元的檔案列表,返回的列表並不排序,如果需要排序就需要呼叫lsort命令。

如果初始變元使用-開頭,就作為標誌出現,以下所述是目前支援的標誌位:

-directory directory 
在給定的資料夾中尋找匹配的檔案,允許在資料夾中尋找包含通配風格字元的檔案,這個標誌位不能和-path一起使用 
-join 
剩下的pattern變元被認為是一個路徑名的各個部分,將會被組合起來,類似於file join命令的方式 
-nocomplain 
允許返回一個空列表而不是錯誤,如果沒有這個標誌位當尋找不到與模式匹配的檔案時就返回一個錯誤 
-path pathPrefix 
尋找以pathPrefix開頭、其它部分匹配給定模式的檔案,這種模式允許在pathPrefix中出現glob敏感的匹配字元,不能夠和-directory一起使用。例如,尋找所有包含相同$path根名字但是不同副檔名的檔案,需要使用命令glob -path [file rootname $path] .*,這個命令中的$path允許包含glob敏感的匹配字元 
-tails 
只返回檔案的檔名而不是包含整個路徑的檔名,需要和-directory或-path一起使用。glob -tails -directory $dir *這個命令和set pwd [pwd]; cd $dir ; glob *; cd $pwd這一系列命令的執行結果是相同的,對於-path,返回的檔名是包含整個檔名的,所以glob -tails -path [file rootname ~/foo] .*將返回形如foo.aux foo.bib foo.tex的檔案而不是形如.aux .bib .tex的檔案。 
-types typeList 
只有列出匹配typeList的檔案或資料夾,typeList有兩種形式。

  
第一種形式就像Unix搜尋命名中的-type可選項,b塊檔案,c字元檔案,d資料夾,f普通檔案,l軟連結,p命名管道,s套接字,可以有多個-type選項一起使用。glob命令返回至少匹配一種型別的所有的檔案。注意,如果指定了-type l或者連結的目標檔案匹配都會返回軟連結檔案,所以在指定-types d時一個資料夾的軟連結也會返回。 
第二種形式指定的型別必須是所有的型別都匹配,r、w、x作為檔案存取屬性,readonly、hidden可以是特殊的存取屬性。在Macintosh上,MacOS型別和建立者也是支援的。像{macintosh type XXXX}或{macintosh creator XXXX} 將匹配檔案型別和建立者。

這兩種形式可以混合使用,所以-type {d f r w}將尋找有可讀和可寫許可權的普通檔案和資料夾。下面兩個命令是等價的:

glob -type d *
glob */
第一種方式不會返回"/"並且是和作業系統無關的。 
-- 
標誌位結束符號。在它之後的變元都將被當作是pattern 
pattern變元可以包含任何以下特殊字元:


匹配任何一個字元 

匹配0個或多個任何字元 
[chars] 
匹配chars中的任何一個字元,如果chars包含一個a-b的形式,那麼是a-b當中的任何一個字元(包括a和b) 
\x 
匹配字元x 
{a,b,...} 
匹配a、b……中的任意一個字串 
在Unix的csh中,以.開頭或者包含/的檔名必須正確匹配或者在{}中,除非-type hidden指定了(因為以.開頭的檔案為隱藏檔案)。在其它作業系統中,以.開頭的檔案沒有什麼特殊,但是檔名為.或者..時必須明確匹配。所有的/字元必須明確匹配。

如果在pattern中第一個字元為~,就引用主目錄,如果~後面為/那麼就會使用HOME環境變數。

glob命令與csh不同,第一,它不會排列返回的結果;第二,glob只返回實際存在的檔名。

示例
搜尋當前目錄下的所有的Tcl檔案:

glob *.tcl
在使用者主目錄中搜尋所有的Tcl檔案:

glob -directory ~ *.tcl
搜尋當前目錄下的所有的子目錄:

glob -type d *
搜尋包含字串"a","b"和"cde"的檔案:

glob -type f *{a,b,cde}*


 glob命令
這裡以例項的形式解釋一下glob命令的用法,很多時候純粹的語法講解根本講不清楚,往往沒有一個例子清晰,一下就glob命令進行一些分析,環境為Tclsh85,作業系統為windows XP。在windows下面資料夾使用\隔開,為了講述方便統一使用/來描述。

 最簡單的方式,cd到目標目錄下,使用
 % glob *
 顯示目標檔案加里所有的檔案。使用
 % glob *.tcl
 顯示目標資料夾裡所有的.tcl檔案。

 如果搜尋不到檔案就會返回一個錯誤,可以使用-nocomplain標誌位來使沒有檔案時返回空,直接使用
 % glob test
 no files matched glob pattern "test"
 報回一個錯誤,而使用
 % glob -nocomplain test
 就返回空。

 如果目前不在目標資料夾,而知道目標資料夾的絕對路徑,可以使用
 % glob -directory d:/tcl/ *
 顯示目標資料夾d:/tcl/裡面的檔案資訊。檔案資訊的顯示方式是顯示檔案的完整的路徑名。比如d:/tcl/lib,如果只想顯示lib檔名,可以使用
 % glob -directory d:/tcl/ -tails *
 -tails表示只顯示檔名,可以與-directory和-path一起使用。

 如果知道檔案的前半部分,需要找後半部分
 % glob -path d:/tcl/li *
 返回d:/tcl/lib d:/tcl/licenses d:/tcl/license-at8.5-thread.terms等三個檔案,如果需要只返回檔名,使用
 % glob -path d:/tcl/li -tails *
 只返回檔名lib licenses license-at8.5-thread.terms。
 
 可以限定返回的檔案型別,使用-type來限定,比如只返回資料夾檔案
 % glob -directory d:/tcl/ -type d *