我們在使用 shell 執行任務的過程中,常常會遇到需要處理一批資料的情況,如果我們乙個乙個的傳遞引數就會非常的麻煩,這時候就需要用到 shell 的萬用字元功能了。例如rm *.txt
可以刪除當前目錄下所有的 txt 檔案。
shell 萬用字元起到的是拓展引數的功能,注意 shell 萬用字元是由 shell 處理的,而不是用到引數的命令或者語句處理的。
例如對於rm *.txt
,shell 在引數遇到萬用字元的時候,會把這個萬用字元當做路徑或者檔案的匹配模式去磁碟上搜尋所有的匹配項。
如果存在匹配,則把所有的匹配項替換到引數去,例如上面的命令最終的形式可能是rm a.txt b.txt
,rm
命令拿到的是實際的檔案列表,而不是*.txt
。
如果不存在匹配或者無法識別該模式,則shell會將該萬用字元作為乙個普通字元傳遞給命令,然後再由命令去處理。例如如果我們目錄下沒有任何 txt 檔案,執行上面的命令就會報錯:no matches found: *.txt
跨目錄匹配
萬用字元只能匹配單層目錄,如果要跨目錄匹配,則要這樣子寫:
rm */*.txt
注意,上面的寫法只能匹配一級子目錄下的 txt 檔案,沒有辦法匹配當前目錄以及二級子目錄下的檔案
如果要匹配當前目錄和一級子目錄下的txt檔案,則要用到多個萬用字元組合,例如如下命令
ls *.txt
注意,以上命令在當前目錄或者一級目錄之一沒有txt檔案的時候,也會報錯。
shell 萬用字元看起來很像正規表示式,然而並不是正規表示式,它的功能比正規表示式要弱,只支援下面幾種萬用字元形式。
匹配 0 或多個字元
匹配任意乙個字元
匹配中的任意單一字元,例如
[abc]
匹配a、b、c中的任何乙個字元。支援範圍匹配,例如
[a-z]
匹配所有小寫字母。
匹配{}
中被,
分隔的任意乙個子字串。例如.txt
匹配到aa.txt
、bb.txt
和cc.txt
,{}
也支援範圍匹配,例如匹配所有大寫字母
{}
和其他萬用字元不同的地方在於,即使沒有匹配到資料,{}
依然會展開。例如
# 如果我們目錄下沒有檔案a,b,下面的命令會報錯:no matches found: [ab]
echo
[a-b]
# 下面的命令則會輸出:a b
echo
{}
支援巢狀,因此可以組合成複雜的模式。例如
echo,b}
#輸出aa ab ac bb bc
匹配除了
中的其他所有字元,也即不匹配
中的所有字元。
enjoy it !
如果覺得文章對你有用,可以贊助我喝杯咖啡~
Shell 萬用字元
您可能已經在不知不覺中早已使用了通配 中指定檔案或尋找檔案時,您使用 代表任意字串。例如 txt 同所有以 txt 結尾的檔案相匹配。我們也在上一節常常使用到它們。不過,除了 還有很多其他的萬用字元。當您鍵入ls txt命令並按enter後,尋找哪些檔案同 txt 模式相匹配的任務不是由ls命令,而...
shell中的萬用字元
shell支援的萬用字元 shell支援一組萬用字元用於處理資料,但是要和正規表示式區別開來。shell的萬用字元實現的功能比較簡單,常用於檔名匹配,遠不及正規表示式強大和廣泛。不過對於日常使用linux還是有非常大的幫助的。下表取自 鳥哥的linux私房菜 符號意義 代表 0 個到無窮多個 任意字...
Shell中的萬用字元
在 bash 中,如果需要模糊匹配檔名或目錄名,就要用到萬用字元。下面為常用的萬用字元。萬用字元說明 匹配0或任意個字元 匹配乙個任意字元 匹配中括號的字元。例如 a b 匹配小寫字母,只會匹配集合中的乙個 匹配除了中括號的乙個字元。例如 0 9 匹配除了數字的字元,只會匹配集合中的乙個 匹配其中乙...