【发布时间】:2011-07-08 17:34:44
【问题描述】:
为什么find . -name "*.xml" | xargs grep FOO 返回匹配文件名,而find . -name "*.xml" | xargs -i -sh -c "grep FOO {}" 不返回?
【问题讨论】:
为什么find . -name "*.xml" | xargs grep FOO 返回匹配文件名,而find . -name "*.xml" | xargs -i -sh -c "grep FOO {}" 不返回?
【问题讨论】:
除非在发布您的问题时出现拼写错误,否则sh 之前不应有连字符:
您没有在输出中获得文件名的原因是 grep 正在使用单个文件作为参数运行。要强制文件名输出,请使用-H。
find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"
此外,xargs 的 -i 在版本 4.2.9 左右已被弃用。你应该使用-I {}。
【讨论】:
你可以使用
find . -name "*.xml" | xargs -I{} grep FOO {}
您可以根据需要在grep 命令中使用-H 或-n。
【讨论】:
正如前面的回答所说,不同之处在于 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.
【讨论】: