Command-Line

引用參數到 find 有什麼影響?

  • February 15, 2017

在查找 txt 文件時,我執行以下命令:

find . -name "*.txt" -print

這給了我目前目錄下所有文本文件的列表。

但是,find . -name *.txt -print給了我以下錯誤: find: paths must precede expression: mein.txt

這是普遍預期的行為嗎?引號有什麼區別?

在未引用的標記中,執行擴展的是您的 shell,而不是您正在執行的命令。

這意味著,當您輸入 時find . -name "*.txt" -print, find 接收文字*.txt作為其參數之一,並將此模式用作其-name選項的參數,該選項將匹配在應用之前找到的文件名-print

另一方面,當您輸入 時find . -name *.txt -print,shell 會通過擴展版本*.txt來查找。幾種情況是可能的:

  1. *.txt目前目錄中沒有匹配的文件: find 接收文字*.txt(假設預設 bash 設置);
  2. 目前目錄中只有一個文件匹配*.txt;假設它是a.txt: find 接收這個文件名,並匹配a.txt從目前目錄開始的所有名為 find 的文件;
  3. 目前目錄中有幾個文件匹配*.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.

引用自:https://unix.stackexchange.com/questions/345304