2010-11-29 67 views
10

在Bash中,如何匹配正則表達式與多個條件對文件名? 例如,我想用.txt或.log結尾匹配所有文件。文件名匹配的正則表達式

我知道如何搭配一種標準:

for file in *.log 
do 
     echo "${file}" 
done 

什麼是語法邏輯或匹配兩種或多種類型的標準是什麼?

回答

14

按照您調用ls的方式進行操作。您可以在其他以後指定多個通配符之一:

for file in *.log *.txt 
+0

大部分的工作,但唯一奇怪的是,當我沒有.txt文件時,「.txt」得到回顯。 – Mike 2010-11-29 20:33:07

+2

@Mike你需要使用shopt builting來設置nullglob shell選項來避免這個 – thkala 2010-11-29 20:47:11

1
for f in $(find . -regex ".*\.log") 
do 
    echo $f 
end 
8
for file in *.{log,txt} .. 
3

您只需添加其他條件到最後:

for VARIABLE in 1 2 3 4 5 .. N 
do 
    command1 
    command2 
    commandN 
done 

所以你的情況:

for file in *.log *.txt 
do 
     echo "${file}" 
done 
17

當globbing(filena)時,Bash不支持正則表達式本身我匹配)。然而,它的通配語法可能相當通用。例如:

for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do 
... 
done 

將適用於以A開頭的文件循環的內容,並在B,則該點,結束任何以下擴展名:

  • 日誌
  • TXT
  • R跟一個小寫字母后跟一個數字,然後通過相當多的東西
  • ç

它還會將循環命令應用於以Z開頭的文件,然後是0-5範圍內的數字,然後是.c擴展名。

如果你真的想/需要,您可以啓用擴展與shopt內建通配符:

shopt -s extglob 

然後允許顯著更多的功能,而匹配的文件名,如子模式等

更多信息請參見Bash的手冊上支持的表達式:

http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching

編輯:

如果表達式與文件名不匹配,默認情況下bash會替換表達式本身(例如,它會回顯* .txt)而不是空字符串。您可以通過設置外殼了nullglob選項更改此行爲:

shopt -s nullglob 

這將取代有一個空字符串沒有匹配的文件* .TXT。

編輯2:

我建議你也檢查出shopt內置及其選項,因爲不少人的影響的文件名模式匹配,並在外殼的其它方面:

http://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin

3

你也可以這樣做:

shopt -s extglob 
for file in *.+(log|txt) 

它可以很容易地擴展到更多的選擇:

for file in *.+(log|txt|mp3|gif|foo)