Linux 中带括号和不带括号的 xargs 有什么区别?

Linux 中带括号和不带括号的 xargs 有什么区别?

我想知道这有什么区别

ls | xargs rm
ls | xargs -i{} rm {}

两者都对我有用

答案1

xargs rmrm使用以空格分隔的所有参数作为参数进行调用。

xargs -i{} rm {}rm {}将为每个参数调用并将{}被当前参数替换。

如果你有 2 个参数a.txtb.txtxargs rm 将调用此

rm a.txt b.txt

xargs -i{} rm {}会打电话

rm a.txt
rm b.txt

这是因为-i选项隐含-L 1选项,这意味着命令每次rm只占用1一行。这里每行只包含 1 个参数。

检查一下Ideone 链接以获得更多的想法。

答案2

-ioption(相当于--replace)创建一种占位符,xargs 会将刚刚收到的输入存储在该占位符中。在第二个命令中,占位符是{},其作用类似于 find -execoption。定义后,xargs 将用整行输入替换此占位符。如果您不喜欢该{}名称,可以定义自己的名称:

ls | xargs  -iPLACEHOLDER echo PLACEHOLDER

就您而言,两个命令都产生相同的结果。在第二种形式中,您只是使用选项明确了默认行为-I

答案3

使用括号时,它将为rm每个文件生成一个进程。不使用括号时,xargs它将向每个命令传递尽可能多的文件名rm

比较

ls | xargs echo

ls | xargs -I {} echo {}

相关内容