使用帶有通配符的雙引號或無引號

使用帶有通配符的雙引號或無引號

我碰到文章試圖解釋 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,它在內部使用模式來匹配檔案名稱。

相關內容