如何理解xargs
How to understand xargs
说我有两个文件t1
和t2
,它们的内容相同: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
说我有两个文件t1
和t2
,它们的内容相同: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