Find

在查找結果上使用 xargs 時如何處理文件名中的空格?

  • March 27, 2015

我的一種常見做法是對特定類型的所有文件執行 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 建構其命令行的方式非常相似。命令中只允許有一個“{}”實例。該命令在起始目錄中執行。

引用自:https://serverfault.com/questions/268368