find 与 xargs 、exec

以前使用find一直都是用-exec处理查找到的文件,毕竟使用比较少,涉及的不多,大多数用以下一条就够了。

find ./ -type f -iname "*.wav" -exec cp {} ~/wav/ \;

忽略文件名大小写,使用-iname


看很多人都用管道和xargs跟find搭配,查了一下才知道:很多命令不支持管道来传递参数!


当然,find有自己的执行参数-exec,可以将查找到的参数以{}的形式进行处理(最后要加上 \;)

而 find 和 exec 、 xargs 搭配使用也是有区别的:

1、exec

find将匹配到的文件传给exec执行,每找到一次传一次

但是,如果文件名太过长(超过了几K)时,会出现命令行超长报错的问题。

2、xargs

find将所有匹配到的文件通过管道,一股脑全部传递,这些文件名组合成命令的参数。

但是,当文件很多,文件名超长的时候,也会出现命令错误。

另外,当查找到的文件名有空格时,也容易出错,误认空格为文件名参数分隔符。

来验证下:

当前目录下有10个txt文件


使用exec看处理情况


可以看出,exec是每次查找到一个,就执行一次


在看看xargs的处理情况:


可以看出,xargs是将所有结果当做参数,一次性全部执行。


看下文件名有空格的情况,创建一个含空格的文件“a b c.txt”


直接删除报错



为了防止文件名有空格,可以使用以下命令进行xargs的处理

find ./ -type f -iname "*.txt" -print0 | xargs -0 rm


查看处理结果

文件被正确删除了。


xargs也可以使用文件代位符,默认为{}

find ./ -type f -iname "*.txt" -print0 | xargs -0 rm {}

也可以通过-i进行文件代位符设置

find ./ -type f -iname "*.wav" -print0 | xargs -0 -i{} cp {} ~/wav/

从效率方面考虑:

1、exec

每次处理一个文件都要启动一次,效率不好。

固定文件代位符{},且要在命令最后加上 \;作为命令的结束符

2、xargs

一次性处理多个文件。

要注意文件名含空格的情况,建议使用-print0和-0进行避免。


总体来说,使用xargs要比exec好一些。当然,也可以根据具体情况和个人喜好进行选择。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值