说我有两个文件t1和t2,它们有相同的内容:abc。
现在我要删除包含字符串abc的所有文件。
因此,我尝试执行命令:grep -rl abc . | rm,但它不起作用。
然后,我添加了xargs:grep -rl abc . | xargs rm,它可以工作。
我不明白xargs做了什么。
发布于 2018-04-12 12:19:25
grep将输出设置为stdout。但是rm不能处理来自stdin的数据(管道链接两者都是)。
相反,您希望将grep的输出作为rm的参数。因此,xargs命令“将”stdin转换为xargs第一个参数的参数,并调用该命令(第一个参数)。
作为替代,你可以
rm `grep -rl abc .`或
rm $(grep -rl abc .)但是xargs也很好地处理了一个命令的单个调用有太多的参数的情况。上面的命令会给出shell错误(参数字符串太长)。
发布于 2018-04-12 12:19:34
rm不从标准输入(提示时除外,比如-i)读取,而是在命令行中使用它的参数。这就是xargs为您所做的:从标准输入中读取内容,并将它们作为参数提供给rm。
使用echo的示例
$ (echo a; echo b; date) | xargs echo
a b tor 12 apr 2018 14:18:50 CESThttps://stackoverflow.com/questions/49795854
复制相似问题