前言
我們?cè)谑褂?shell 執(zhí)行任務(wù)的過程中,常常會(huì)遇到需要處理一批數(shù)據(jù)的情況煮岁,如果我們一個(gè)一個(gè)的傳遞參數(shù)就會(huì)非常的麻煩,這時(shí)候就需要用到 shell 的通配符功能了。例如rm *.txt
可以刪除當(dāng)前目錄下所有的 txt 文件匠楚。
功能
shell 通配符起到的是拓展參數(shù)的功能,注意 shell 通配符是由 shell 處理的厂财,而不是用到參數(shù)的命令或者語句處理的芋簿。
例如對(duì)于 rm *.txt
,shell 在參數(shù)遇到通配符的時(shí)候璃饱,會(huì)把這個(gè)通配符當(dāng)做路徑或者文件的匹配模式去磁盤上搜索所有的匹配項(xiàng)与斤。
如果存在匹配,則把所有的匹配項(xiàng)替換到參數(shù)去荚恶,例如上面的命令最終的形式可能是 rm a.txt b.txt
撩穿,rm
命令拿到的是實(shí)際的文件列表,而不是*.txt
谒撼。
如果不存在匹配或者無法識(shí)別該模式食寡,則shell會(huì)將該通配符作為一個(gè)普通字符傳遞給命令,然后再由命令去處理廓潜。例如如果我們目錄下沒有任何 txt 文件抵皱,執(zhí)行上面的命令就會(huì)報(bào)錯(cuò):no matches found: *.txt
跨目錄匹配
通配符只能匹配單層目錄,如果要跨目錄匹配辩蛋,則要這樣子寫:
rm */*.txt
注意呻畸,上面的寫法只能匹配一級(jí)子目錄下的 txt 文件,沒有辦法匹配當(dāng)前目錄以及二級(jí)子目錄下的文件
如果要匹配當(dāng)前目錄和一級(jí)子目錄下的txt文件堪澎,則要用到多個(gè)通配符組合擂错,例如如下命令
ls *{\/*,}.txt
注意,以上命令在當(dāng)前目錄或者一級(jí)目錄之一沒有txt文件的時(shí)候樱蛤,也會(huì)報(bào)錯(cuò)钮呀。
通配符
shell 通配符看起來很像正則表達(dá)式,然而并不是正則表達(dá)式昨凡,它的功能比正則表達(dá)式要弱爽醋,只支持下面幾種通配符形式。
*
匹配 0 或多個(gè)字符
?
匹配任意一個(gè)字符
[]
匹配 []
中的任意單一字符便脊,例如[abc]
匹配a蚂四、b、c中的任何一個(gè)字符。[]
支持范圍匹配遂赠,例如 [a-z]
匹配所有小寫字母久妆。
{,}
匹配{}
中被,
分隔的任意一個(gè)子字符串。例如{AA,BB,CC}.txt
匹配到 AA.txt
跷睦、BB.txt
和CC.txt
筷弦,{}
也支持范圍匹配,例如{A..Z}
匹配所有大寫字母
{}
和其他通配符不同的地方在于抑诸,即使沒有匹配到數(shù)據(jù)烂琴,{}
依然會(huì)展開。例如
# 如果我們目錄下沒有文件A蜕乡,B奸绷,下面的命令會(huì)報(bào)錯(cuò):no matches found: [AB]
echo [A-B]
# 下面的命令則會(huì)輸出:A B
echo {A-B}
{}
支持嵌套,因此可以組合成復(fù)雜的模式层玲。例如
echo {a{a..c},b{b..c}}
#輸出aa ab ac bb bc
[!]和[^]
匹配除了 []
中的其他所有字符号醉,也即不匹配[]
中的所有字符。
Enjoy it !
如果覺得文章對(duì)你有用称簿,可以贊助我喝杯咖啡~
版權(quán)聲明
轉(zhuǎn)載請(qǐng)注明作者和文章出處
作者: X先生
http://www.reibang.com/p/0673af7356a5