为什么find . -name "*.xml" | xargs grep FOO会返回与文件名匹配的内容,而find . -name "*.xml" | xargs -i -sh -c "grep FOO {}"不会?
发布于 2011-03-04 23:44:48
除非你的问题是拼写错误,否则在sh之前不应该有连字符
您没有在输出中获得文件名的原因是,grep是以单个文件作为参数运行的。要强制文件名输出,请使用-H。
find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"此外,用于xargs的-i在版本4.2.9左右已弃用。您应该使用-I {}。
发布于 2013-10-12 22:49:02
正如前面的回答所说,不同之处在于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-03-14 10:21:11
你可以直接使用
find . -name "*.xml" | xargs -I{} grep FOO {}您可以根据需要在grep命令中使用-H或-n。
https://stackoverflow.com/questions/5192564
复制相似问题