find的-regex與-name的區別
1. 與-name, -iname最大的區別就在於 -regex是把find輸出的整個結果(有別於絕對路徑名)作為要匹配的對象, 而不僅僅是結果的最後一部分
www.2cto.com
舉例
/tmp目錄下有且僅有 aaa, aa, 1, 2 這些文件
find -name "a*"可以找到
aaa和aa
而find /tmp -regex "a*"就不行, 它一個都找不到, 因為找到的每個結果是這樣的
/tmp/aaa
/tmp/aa
-name 是對結果中的"aaa"和"aa"這個部分進行匹配, 而-regex卻是對完整的
"/tmp/aaa"和"/tmp/aa"進行匹配.
所以你要寫作find /tmp -regex ".*a.*"
2. 注意上面的是.*而不是*
www.2cto.com
-name所能解釋的是基於shell中file glob的匹配字符, 包括:
(1)*表示任意長度字符串
(2)?表示任意的單個字符
(3)[set] 表示一個可選字符集合
(4)[^set]或[!set]表示以ASCII為全集對[set] 求補集的一個集合
(5)brace expansion, 即把/tmp/{a,b,c}擴展為三個字串
/tmp/a /tmp/b 和/tmp/c
注意 shell的file globing機制往往不被認為是正則表達式.
-regex接受的是"正統"的正則表達式
這個說起來東西多了, 基本上它跟emacs文檔裡講的regex是一樣的, 因為find手冊裡regex的解釋部分實際就是鏈接到emacs 中講解regex的那個部分. 在上面例子中最大區別就是.* 來表示任意長度字符串.