***大家好,我是Linux初学者,对于管道和xargs的区别一直不是很清晰,最近查了很多博客,通过总结各位大牛的文章,发表一下我对管道和xargs的见解。***
举个经典的例子:首先当前目录处于/root,里面有anaconda-ks.cfg, a.txt, install.log, install.log.syslog,四个文件。键入以下命令:
echo ‘--help‘ | ls 单纯的管道
echo ‘--help‘ | xargs ls xargs命令
第一条命令的结果:
anaconda-ks.cfg, a.txt, install.log, install.log.syslog
第二条命令的结果:(太长了,截一点,具体可以动手自己试试)
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
这说明了什么?大家都知道echo是输出指定字符串,ls是显示目标列表。
说明了第一条命令是通过管道传过来纯文本,ls识别不了。可以这样理解,ls命令后面要跟的就是一个实体的目录,比如一个箱子,而前面命令结果给的是一大堆文字,他不认识;第二个命令,是将前面命令的结果作为参数给后面命令使用,那不就是ls的--help帮助命令嘛。
如果还不是很清晰,再来一条试试。
/data目录下有a.txt b.txt c.txt
find /data -type f -name ‘.txt‘ | grep ‘.txt‘
find /data -type f -name ‘.txt‘ | xargs grep ‘.txt‘
第一条命令的结果是
/data/a.txt
/data/b.txt
/data/c.txt
第二条命令的结果是什么都没有
为什么会这样呢?
其实大家通过多尝试,可以总结出,管道相当于把前面命令处理的结果当作了纯文本文字传递给了后面的命令,grep是对文本过滤的命令,所以第一条命令过滤出了带有“.txt”字样的文本;而xargs相当于把前面命令处理的结果当作文件传递给后面命令处理,你想想,grep能处理文件码?不能是吧,所以什么结果都不会显示。
总结:使用管道还是xargs取决于你后面的命令要处理什么,如果是纯文本文字,用管道;如果是文件,用xargs。
附言:我也是个新手,这些是看了很多博客总结出来的,有可能不是很对,哪有错误希望大家多指出,写文章是为了加强理解和记忆,希望在未来的路上,我们共同努力,能够打拼出一片属于自己的天下。
伟
2018/10/17
原文地址:http://blog.51cto.com/13849532/2301016