在查找结果上使用xargs时,如何处理文件名中的空格?


28

我的常见做法之一是对某种类型的所有文件执行抓取,例如,找到其中包含单词“ 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吗?还是我必须使用完全不同的命令?

Answers:


29

使用

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.

15

您不需要使用xargs,因为find本身可以执行命令。这样做时,您不必担心外壳解释名称中的字符。

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

从查找手册页

-exec命令{} +
-exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将大大少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅允许一个{{}”实例。该命令在起始目录中执行。


我会对此表示赞成,但我今天没有离开-明天再做。
user9517支持GoFundMonica 2011年

1
@Iain-您去了(顺便说一句,我同意)。
Eduardo Ivanec

仅仅使用find,您仍然会错过xargs的功能,此外,您还必须处理愚蠢的引用规则。如果您有多个内核/ CPU,请参见xargs的-P参数。
Slartibartfast

8

如果系统上的find和xarg版本不支持-print0-0切换(例如AIX find和xargs),则可以使用以下命令:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

sed在这里将为xargs保留空格。


这对我有帮助,因为我有很长的文件名列表,这些文件名很难使用,因此多次使用。我不能再find全部放弃。
Scott M.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.