在 find [duplicate] 中與參數 -name 相符的值使用雙引號

在 find [duplicate] 中與參數 -name 相符的值使用雙引號

為什麼與參數-namein匹配的值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

如果沒有雙引號,則*.outshell 會擴展 ,這意味著它會被當前目錄中匹配的所有檔案名稱替換*.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")

也許我誤解了這個問題?

相關內容