为什么find . -name "*.xml" | xargs grep FOO
返回与文件名匹配,而不匹配find . -name "*.xml" | xargs -i -sh -c "grep FOO {}"
?
问问题
8906 次
3 回答
8
除非在发布您的问题时出现错字,否则之前不应有连字符sh
:
您没有在输出中获得文件名的原因grep
是使用单个文件作为参数运行。要强制文件名输出,请使用-H
.
find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"
此外,-i
forxargs
在 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
指挥。-n
grep
于 2013-03-14T02:21:11.267 回答