小教程收藏程序员

一点知识--Linux 管道、xargs、-exec区别

2018-01-18  本文已影响1110人  是阿离

问题

在使用find ./ -name "*.txt*" | ls -l | awk -F " " '{ans+=$5}END{print ans}'时,发现执行结果并不对……
又进行了如下尝试:

find ./ -name "*.txt*" | xargs ls -l | awk -F " " '{ans+=$5}END{print ans}'
find ./ -name "*.txt*" -exec ls -l {} \;| awk -F " " '{ans+=$5}END{print ans}'

发现若.txt文件存在的情况下,两者执行结果相同,但如果.txt文件不存在,xargs ls -l返回的是当前目录列表,-exec ls -l {} \;没有任何返回。
还有一种使用命令替换的方式:

ls -l `find ./ -name "*.txt*"` | awk -F " " '{ans+=$5}END{print ans}'

执行结果与xargs ls -l相同。
问题来了:使用|管道、xargs、以及find中的-exec有啥区别?

一点知识

|管道

将前一个命令的输出作为标准输入传给后面的命令,不会用到任何中间文件与缓冲区。

xargs

将前一个命令的输出作为命令行参数传给后面的命令。

由此可见,类似于ls这种只能读取命令行参数的命令,只能使用xargs来进行输出传递。

-exec

find命令中-exec参数将查询结果通过命令行参数传递给后面的命令。

-execxargs不同的是:-exec是将结果逐条传递给后面的命令,后面的命令逐条执行。xargs是将结果作为一个列表全部传递给后面的命令,后面的命令一次性执行参数串,可以通过xargs -p ls -l来查看即将要执行的完整的命令。

Tips:

参考文章

xargs命令详解,xargs与管道的区别
chapter 11. 构建基本脚本

上一篇 下一篇

猜你喜欢

热点阅读