如何理解xargs?为何grep匹配文件后管道rm无效,加xargs却生效?
为啥直接用管道到
rm不行,xargs却能搞定? 嘿,这个问题问得特别典型!我来给你拆解清楚背后的逻辑:
先搞懂管道的本质
管道(|)的作用是把前一个命令的标准输出内容,传递给后一个命令的标准输入。但问题在于:rm命令根本不读标准输入啊!它只认在命令行里直接写的参数(比如rm t1 t2里的t1、t2)。
所以你执行grep -rl abc . | rm的时候,grep确实输出了t1和t2,但这些内容只是被传到了rm的标准输入里,rm完全不理会这些,它觉得自己没有收到任何要删除的文件名参数,自然啥也不会做。
xargs到底在干啥?
xargs就是专门解决这个“标准转参数”问题的工具!它会把前一个命令输出的内容(这里就是grep找到的文件名),转换成后续命令的命令行参数。
举个具体的例子,当你执行grep -rl abc . | xargs rm时:
grep输出两行:t1和t2xargs把这两行内容收集起来,变成rm的参数- 最终相当于执行了
rm t1 t2——这正是rm需要的格式,所以就能成功删除文件了!
小补充(可选)
如果你的文件名里包含空格、换行或者特殊字符,普通的xargs可能会出错,这时候可以搭配grep的-Z参数和xargs的-0参数,让它们用null字符分隔文件名,避免解析错误:
grep -rlZ abc . | xargs -0 rm
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

