Find
在查找結果上使用 xargs 時如何處理文件名中的空格?
我的一種常見做法是對特定類型的所有文件執行 greps,例如,查找所有包含“rumpus”一詞的 HTML 文件。為此,我使用
find /path/to -name "*.html" | xargs grep -l "rumpus"
有時,
find
將返回名稱中帶有空格的文件,例如my new file.html
. 但是,當xargs
將此傳遞給grep
時,我收到以下錯誤:grep: /path/to/bad/file/my: No such file or directory grep: new: No such file or directory grep: file.html: No such file or directory
我可以看到這裡發生了什麼:管道或將
xargs
空格視為文件之間的分隔符。但是,對於我的一生,我無法弄清楚如何防止這種行為。可以用find
+完成xargs
嗎?還是我必須使用完全不同的命令?
採用
find ... -print0 | xargs -0 ...
例如
find /path/to -name "*.html" -print0 | xargs -0 grep -l "rumpus"
從查找手冊頁
-print0 True; print the full file name on the standard output, followed by a null character (instead of the newline character that ‘-print’ uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by pro- grams that process the find output. This option corresponds to the ‘-0’ option of xargs.
您不需要使用xargs,因為find可以自己執行命令。這樣做時,您不必擔心 shell 會解釋名稱中的字元。
find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +
從查找手冊頁
-exec command {} +
-exec 操作的變體在選定的文件上執行指定的命令,但命令行是通過在末尾附加每個選定的文件名來建構的;該命令的呼叫總數將遠少於匹配文件的數量。命令行的建構方式與 xargs 建構其命令行的方式非常相似。命令中只允許有一個“{}”實例。該命令在起始目錄中執行。