为什么find . -name "*.xml" | xargs grep FOO
会返回与文件名的匹配,而find . -name "*.xml" | xargs -i -sh -c "grep FOO {}"
却没有?
答案 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
命令中使用-n
或grep
。