Linux 管道、xargs、-exec区别

问题

在使用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:

  • 目前已知的只能读取命令行参数的命令有:ls、rm。

  • 通过分析-execxargs的不同,就会发现如果在find中使用-exec+ls -lrt的方式,列表并没有进行排序,若想要排序,可使用xargs+ls -lrt,不过要注意-exec与xargs区别

find ./ -name "*log*" -exec ls -lrt {} \;   --rt无效
find ./ -name "*log*" | xargs ls -lrt  --rt有效

 

Guess you like

Origin blog.csdn.net/zhuchunyan_aijia/article/details/114106420