如果一个文件夹下有大量的文件,则对这些文件进行操作的时候,很可能会出现“参数列表过长”的错误提示,解决的方法主要有:
(1)写脚本;
(2)通过find的exec参数来实现
(3)用xargs
(4)上级目录操作
这几种方式,到底哪一种快呢?我们来做一下对比。
环境:/web/upload下,有6万个文件
%cd /web/upload
% ll | wc
60552 544961 4824590
操作方式:
共六种操作,由于是远程操作,显示大量文件名时会受带宽的影响,所以ls –l后重定向到/dev/null:
find –exec两种,分别用分号和加号结束
xargs两种,一种用print0,另一种默认
写脚本
对上级目录操作
1、直接find,用分号结束:
% time find /web/upload -name " eclass*" -exec ls -l {} > /dev/null \;
27.279u 92.251s 2:19.79 85.4% 40+169k 2043+0io 0pf+0w
2、直接find,用分号结束:
% time find /web/upload -name " eclass*" -exec ls -l {} > /dev/null +
0.456u 1.085s 0:15.18 10.0% 38+316k 1379+0io 0pf+0w
3、xarg –0
由于没法直接用命令重定向到/dev/null,所以还是写了一个脚本:
% time ./a.sh
0.437u 1.266s 0:15.57 10.8% 39+480k 1392+0io 0pf+0w
% cat a.sh
find /web/upload -name "eclass*" -print0|xargs -0 ls -l > /dev/null
4、普通的xarg
% time ./b.sh
0.478u 1.225s 0:15.47 10.9% 34+425k 1323+0io 0pf+0w
% cat b.sh
find /web/upload -name "eclass*" |xargs ls -l > /dev/null
5、普通sh脚本:
% time ./c.sh
34.369u 122.142s 3:45.42 69.4% 76+172k 6710+0io 0pf+0w
% cat c.sh
for i in /web/upload/eclass*;
do ls -l "$i" > /dev/null ;
done
6、直接对上级文件夹进行ls
% time ls -l /web/* > /dev/null
0.634u 1.029s 0:07.97 20.7% 36+177k 523+0io 0pf+0w
通过上面的结果,我们可以得出结论:
(1)find –exec +的方式最快,比分号结束的方式要快十倍,据说这种方式最为优化。
(2)普通脚本最慢,这也在情理之中。
(3)xarg 的速度跟find用加号结束的速度差不多,表现非常不错。
(4)xarg 用-0参数,并没见到很大优势,这是因为man中提到,在有空格的场合才能提高速度,这有待于以后再测试。
(5)原生的ls最快,但是不能对下一级目录使用通配符,也不能指定其中的某一个目录,所以不适用于存在很多兄弟目录的情况。
该贴由hui.chen转至本版2014-11-5 17:04:58