![Linux 中带括号和不带括号的 xargs 有什么区别?](https://linux22.com/image/1344939/Linux%20%E4%B8%AD%E5%B8%A6%E6%8B%AC%E5%8F%B7%E5%92%8C%E4%B8%8D%E5%B8%A6%E6%8B%AC%E5%8F%B7%E7%9A%84%20xargs%20%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我想知道这有什么区别
ls | xargs rm
ls | xargs -i{} rm {}
两者都对我有用
答案1
xargs rm
将rm
使用以空格分隔的所有参数作为参数进行调用。
xargs -i{} rm {}
rm {}
将为每个参数调用并将{}
被当前参数替换。
如果你有 2 个参数a.txt
和b.txt
,xargs rm
将调用此
rm a.txt b.txt
但xargs -i{} rm {}
会打电话
rm a.txt
rm b.txt
这是因为-i
选项隐含-L 1
选项,这意味着命令每次rm
只占用1
一行。这里每行只包含 1 个参数。
检查一下Ideone 链接以获得更多的想法。
答案2
-i
option(相当于--replace
)创建一种占位符,xargs 会将刚刚收到的输入存储在该占位符中。在第二个命令中,占位符是{}
,其作用类似于 find -exec
option。定义后,xargs 将用整行输入替换此占位符。如果您不喜欢该{}
名称,可以定义自己的名称:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
就您而言,两个命令都产生相同的结果。在第二种形式中,您只是使用选项明确了默认行为-I
。
答案3
使用括号时,它将为rm
每个文件生成一个进程。不使用括号时,xargs
它将向每个命令传递尽可能多的文件名rm
。
比较
ls | xargs echo
和
ls | xargs -I {} echo {}