如何理解xargs

How to understand xargs

说我有两个文件t1t2,它们的内容相同:abc.

现在我想删除所有包含字符串 abc.

的文件

所以我尝试执行命令:grep -rl abc . | rm 但它不起作用。

然后我添加 xargs: grep -rl abc . | xargs rm 并且有效。

我看不清楚xargs做了什么。

grep 将输出设为 stdout。但是 rm 无法处理来自 stdin 的数据(管道连接两者)。

相反,您希望将 grep 的输出作为 rm 的参数。所以 xargs 命令 "convert" 标准输入到 xargs 第一个参数的参数中,它调用命令(第一个参数)。

作为替代方案,您可以这样做

rm `grep -rl abc .`

rm $(grep -rl abc .)

但是 xargs 也能很好地处理单次命令调用参数过多的情况。上面的命令会给你 shell 错误(参数字符串太长)。

rm 不从标准输入读取(提示时除外,如 -i),而是在命令行上获取其参数。这就是 xargs 为您所做的:从标准输入中读取内容并将它们作为参数提供给 rm

示例echo

$ (echo a; echo b; date) | xargs echo
a b tor 12 apr 2018 14:18:50 CEST