以前使用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好一些。当然,也可以根据具体情况和个人喜好进行选择。