linux文件名匹配——通配符使用
背景:在linux使用過程中,經常需要查找文件,對命令中的通配符pattern和正則表達式的區分不是很清楚。有必要好好研究一下。
1 掃盲
1.1 通配符和正則表達式
當在使用命令行時,有很多時間都用來查找你所需要的文件,如ls find等。 S h e l l提供了一套完整的字符串模式匹配規則,或者稱之為元字符,當s h e l l遇到上述字符時,就會把它們當作特殊字符,而不是文件名中的普通字符,這樣用戶就可以用它們來匹配相應的文件名,我理解這可以稱為通配符。
通配符與正則表達式是有區別的,簡單來說:通配符是用來通配的,正則表達式是用來匹配字符串的;
在文本過濾工具裏,都是用正則表達式
而通配符多用在文件名上,比如查找find,ls,cp,等等。
其次,shell對通配符與正則表達式的處理也有不同,“ ”內一般為通配符(是shell本身提取處理),‘ ’內一般為正則表達式(shell會將其中的數據傳遞給其它命令處理)。
2 通配符詳細介紹
測試數據
touch a a6.log abc.log ac.txt b c c5.txt x.log A
“*”
代表任意多個字符
例:查詢以".log"結尾的文件 ll *.log
“?”
代表任意單個字符
例:只查詢a、b、c
ll ?
“[]”
代表“[”和“]”之間的某一個字符,比如[0-9]可以代表0-9之間的任意一個數字,[a-zA-Z]可以代表a-z和A-Z之間的任意一個字母,字母區分大小寫。
例:只查詢字母文件
ll [a-zA-Z]
例:查詢以“.log”結尾且“.log”前只有兩個字符的文件且第二個字符是數字 ll ?[0-9].log
“^”
表示匹配結果取反的意思,註意這個通配符必須要在[]中使用
例:查詢不是以“.txt”結尾的文件
ll *[^txt]*
“{}”
表示符合括號內包含的多個文件
例:查詢‘.log’和“.txt”結尾的文件
ll {*.log,*.txt}
註意: “.”這個符合比較特殊,如果匹配的條件加上了該符合那麽說明查詢結果文件就包含帶“.”的文件
例如前面的“^”的例子,如果我這樣查詢“ll *.[^txt]*”,那麽結果就不一樣了
刪除操作
例如:刪除a、b、c和以.txt結尾的文件
rm -f {[abc],*.txt}
當然既然可以查詢當然也可以使用通配符匹配的方式進行移動文件,如果需要在存在很多文件的文件夾中移動某些類型的文件那麽使用通配符匹配的效率就顯而易見了;當時通配符的使用技巧不單單只有這些,有空的可以多去研究。
3 實例
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何單個字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感嘆號!之後的字符。和^的效果一樣
如:
5* 5開頭的所有字符串
*5 5結尾的所有字符串
*5? 以5為倒數第二個字符的字符串
[0-9] 所有以數字的字符
[1,2] 1或者2
[!0-9] 不是數字的字符
ls /etc/[!a-n]*.conf 列出/etc/目錄中不是以字母a到n開頭的,並且以.conf結尾的文件
ls /etc/[a-n]*.conf 列出/etc/目錄中以字母a到n開頭的,並且以.conf結尾的文件
ls /bin/[ck]* 列出以 c或k開頭的文件名
linux文件名匹配——通配符使用