![在 find [duplicate] 中與參數 -name 相符的值使用雙引號](https://rvso.com/image/122612/%E5%9C%A8%20find%20%5Bduplicate%5D%20%E4%B8%AD%E8%88%87%E5%8F%83%E6%95%B8%20-name%20%E7%9B%B8%E7%AC%A6%E7%9A%84%E5%80%BC%E4%BD%BF%E7%94%A8%E9%9B%99%E5%BC%95%E8%99%9F.png)
為什麼與參數-name
in匹配的值find
必須用雙引號引起來?
# find / -type f -name *.out |wc -l 1>mv.out
0403-027 The parameter list is too long.
# cat mv.out
0
# find / -type f -name "*.out" |wc -l 1>mv.out
# cat mv.out
146302
答案1
如果沒有雙引號,則*.out
shell 會擴展 ,這意味著它會被當前目錄中匹配的所有檔案名稱替換*.out
(主要是任何以點結尾.out
但不以點開頭的檔案)。在您的情況下,似乎至少有兩個匹配的文件find
作為參數傳遞給。find
不知道如何處理它們並抱怨參數列表太長。
透過引用該模式,shell 會保持原樣,只需刪除引號並find
看到一個未更改的參數*.out
,這可能就是您想要的。
答案2
我不確定這是否完全正確。但我相信將其放在引號中會使解析器將其讀取為正規表示式。如果沒有引號,我相信星號代表目前目錄中的所有檔案。
檢查以下之間的輸出差異:
$ echo $(find ./ -name *)
和
$ echo $(find ./ -name "*")
因此,使用第一個命令您可能會收到錯誤。如果你有文件富&酒吧在目前目錄中,星號代表檔案名稱。所以命令解析器會像這樣讀取命令:
$ echo $(find ./ -name foo bar)
錯誤輸出將是find: bar: unknown primary or operator
.
第二個指令將星號讀取為正規表示式,表示搜尋任何檔案名稱。
編輯:儘管現在,在對命令進行了更多測試之後,似乎在我的系統上,無論參數值是否在引號中,只要某些文本與星號組合在一起,它就可以工作:
$ echo $(find ./ -name *foo)
是相同的
$ echo $(find ./ -name "*foo")
也許我誤解了這個問題?