Command-Line引用參數到
引用參數到 find
有什麼影響?
在查找 txt 文件時,我執行以下命令:
find . -name "*.txt" -print
這給了我目前目錄下所有文本文件的列表。
但是,
find . -name *.txt -print
給了我以下錯誤:find: paths must precede expression: mein.txt
這是普遍預期的行為嗎?引號有什麼區別?
在未引用的標記中,執行擴展的是您的 shell,而不是您正在執行的命令。
這意味著,當您輸入 時
find . -name "*.txt" -print
, find 接收文字*.txt
作為其參數之一,並將此模式用作其-name
選項的參數,該選項將匹配在應用之前找到的文件名另一方面,當您輸入 時
find . -name *.txt -print
,shell 會通過擴展版本*.txt
來查找。幾種情況是可能的:
*.txt
目前目錄中沒有匹配的文件: find 接收文字*.txt
(假設預設 bash 設置);- 目前目錄中只有一個文件匹配
*.txt
;假設它是a.txt
: find 接收這個文件名,並匹配a.txt
從目前目錄開始的所有名為 find 的文件;- 目前目錄中有幾個文件匹配
*.txt
(這似乎是你的情況):-name
接收第一個作為其參數,其他是要查找的進一步路徑參數,它抱怨在表達式之前沒有給出所有路徑。這是預期的行為。
讓我們假設以下文件層次結構:
. ├── a.txt ├── b.txt ├── c.txt └── foo ├── a.txt ├── b.txt └── c.txt
可以通過將 find 呼叫替換為 來觀察 find 在每種情況下接收的實際參數
printf '%s\n'
,這將在其自己的行上列印每個擴展參數:$ printf '%s\n' . -name "*.txt" -print . -name *.txt -print $ printf '%s\n' . -name *.txt -print . -name a.txt b.txt c.txt -print
如您所見,在給定現有文件的情況下,您發布的第二次呼叫等效於
find . -name a.txt b.txt c.txt -print
.