
我碰到這文章試圖解釋 find 指令。
find /tmp -iname "data*.txt"
現在這篇文章這裡指出
雙引號不抑制以“$”開頭的單字的替換但它們確實抑制了通配符的擴展。
當我嘗試這兩個命令時
admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*" -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall* -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$
輸出似乎是一樣的。在什麼情況下它們會有所不同?為什麼雙引號不抑制通配符的擴展A
?我的印像是 A 不起作用,只有 B 起作用。
答案1
情況B:
find . -iname *gall*
這殼將展開*gall*
為與該模式相符的所有檔案的清單。由於當前目錄中只有一個檔案與該模式匹配,因此這將變為:
find . -iname gallifrey-road-doctors-14437-1366x768.jpg
....所以 find 將搜尋與該確切名稱相符的檔案。foo-gallifrey-road-doctors-14437-1366x768.jpg
將不會被發現。如果你有兩個或多個與 glob 相符的文件,你最終會得到一個格式錯誤的 find 指令;我很確定它會因為錯誤而退出。
情況A:
find . -iname "*gall*"
由於引號,shell慣於擴大格局。這就變成了(這就是所find
看到的):
find . -iname *gall*
之後,find 指令使用該模式來搜尋與該模式相符的所有檔案(和目錄等)。這將找到與gallifrey-road-doctors-14437-1366x768.jpg
模式foo-gallifrey-road-doctors-14437-1366x768.jpg
相符的每個文件*gall*
。
所以:你的命令通過 shell(它不會擴展引號內的全域並去掉最外層的引號),並且然後遍歷到find
,它在內部使用模式來匹配檔案名稱。