為什麼與參數-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")
也許我誤解了這個問題?