使用xargs和xargs -i的细微差别

时间:2011-03-04 10:31:24

标签: bash grep xargs

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

3 个答案:

答案 0 :(得分:7)

除非在发布问题时输入错误,否则sh之前不应该使用连字符:

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

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

此外,-i的{​​{1}}已弃用版本4.2.9。您应该使用xargs

答案 1 :(得分:4)

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

为什么要为每个文件调用grep?这是因为(喜欢或不喜欢)对xargs使用-I(或-i)标志强制命令为每个参数运行一次,比如使用标志“-L 1”来xargs的。

从手册页:

   -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.

答案 2 :(得分:0)

你可以使用

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

您可以根据需要在-H命令中使用-ngrep