5

为什么find . -name "*.xml" | xargs grep FOO返回与文件名匹配,而不匹配find . -name "*.xml" | xargs -i -sh -c "grep FOO {}"

4

3 回答 3

8

除非在发布您的问题时出现错字,否则之前不应有连字符sh

您没有在输出中获得文件名的原因grep是使用单个文件作为参数运行。要强制文件名输出,请使用-H.

find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"

此外,-iforxargs在 4.2.9 版左右被弃用。你应该使用-I {}.

于 2011-03-04T15:44:47.713 回答
4

正如前面的回答所说,不同之处在于 grep 正在为每个文件调用,如果在命令行上只指定了一个文件,则 grep 不会报告文件名,除非给出 -H (--with-filename) 标志。

为什么要为每个文件调用 grep?这是因为(无论喜欢与否)对 xargs 使用 -I(或 -i)标志会强制为每个参数运行一次命令,就像对 xargs 使用标志“-L 1”一样。

从手册页:

   -I replace-str
     Replace occurrences of replace-str in the initial-arguments with names read from
     standard input.  Also, unquoted blanks do not terminate input items; instead the
     separator is the newline character.  Implies -x and -L 1.
于 2013-10-12T14:49:01.980 回答
0

你可以使用

find . -name "*.xml" | xargs -I{} grep FOO {}

您可以根据需要使用或-H指挥。-ngrep

于 2013-03-14T02:21:11.267 回答