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

发布于 2024-10-20 10:16:43 字数 136 浏览 4 评论 0原文

为什么 会找到 . -名称“*.xml”| xargs grep FOO 返回与文件名的匹配,而 find . -名称“*.xml”| xargs -i -sh -c "grep FOO {}" 不是吗?

Why does find . -name "*.xml" | xargs grep FOO returns matchs with filenames, while find . -name "*.xml" | xargs -i -sh -c "grep FOO {}" doesn't?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

红尘作伴 2024-10-27 10:16:43

除非在发布问题时出现拼写错误,否则 sh 之前不应有连字符:

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

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

此外,xargs-i 在版本 4.2.9 左右已被弃用。您应该使用 -I {}

Unless it's a typo in posting your question there shouldn't be a hyphen before sh:

The reason you don't get filenames in the output is that grep is being run with a single file as an argument. To force filename output use -H.

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

Also, -i for xargs was deprecated around version 4.2.9. You should use -I {}.

初熏 2024-10-27 10:16:43

正如前面的答案所述,区别在于为每个文件调用 grep ,并且如果在命令行上仅指定一个文件,则 grep 不会报告文件名,除非给出 -H (--with-filename)标志。

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

从手册页:

 -I 替换-str
     将初始参数中出现的replace-str替换为从中读取的名称
     标准输入。此外,不带引号的空格不会终止输入项;相反
     分隔符是换行符。意味着 -x 和 -L 1。

As a previous answer said, the difference is that grep is being invoked for each file and grep doesn't report the filename if only one file is specified on the command line unless the -H (--with-filename) flag is given.

Why is grep being invoked for each file? That is because (like it or not) the use of the -I (or -i) flag to xargs forces the command to be run once for each argument, like using flag "-L 1" to xargs.

From the manual page:

   -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.
奢望 2024-10-27 10:16:43

您可以直接使用

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

,并且可以根据需要在 grep 命令中使用 -H-n

you can just use

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

and you may use -H or -n in grep command as you need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文