今天做了个测试,生成100万个文件:
脚本如下:
第一种脚本1个,makefile.sh
./file0.sh & ./file1.sh & ./file2.sh & ./file3.sh & ./file4.sh & ./file5.sh & ./file6.sh & ./file7.sh & ./file8.sh & ./file9.sh
第二种脚本10个,file*.sh
#!/bin/bash for filename in $( seq 1 100000 ) do touch ${filename}.txt done
chmod 777 *.sh后,time ./makefile.sh
[root@server2 file]# time ./makefiles.sh real 12m33.165s user 0m55.967s sys 1m7.424s
ls的查看需要这么长时间哦
[root@server2 file]# time ls 。。。。。。 real 1m29.619s user 0m7.660s sys 0m17.980s
基本上在百万级别,ls都成为很耗时的事情了。
ls完了之后就删除吧,结果
[root@server2 file]# time rm -rf *.txt -bash: /bin/rm: Argument list too long real 0m7.475s user 0m4.928s sys 0m2.543s
删不掉啊!!!强制也没用,一个一个来吧!!!
[root@server2 file]# time rm -rf 1*.txt real 0m29.025s user 0m2.653s sys 0m5.925s
2018年2月22日追加
最快的方法是使用rsync同步一个空目录
mkdir empty_dir rsync -a --delete empty_dir/ yourdirectory/
sync删除的原理详见http://blog.liulantao.com/why-can-rsync-rapidly-delete-400000-files.html
在Linux下使用 "rm -rf *" 试图删除非常大量的小文件时,可能会报类似下边的错误:
/bin/rm: Argument list too long.
这是因为通配符"*"在执行时会被每个匹配的文件名来替换,例如“rm -rf file1 file2 file3 file4″。
系统只分配了一个比较小的缓冲区用来对这个列表进行排序,如果这个缓冲区满了,则shell不能执行这个命令。
为了解决这个问题,很多人使用find命令来操作。即用find查找每一个文件,然后把文件名一个接一个的传递个rm命令,形式如下:
find . -type f -exec rm -v {} \;
这方法太慢。
http://www.stevekamerman.com/2008/03/deleting-tons-of-files-in-linux-argument-list-too-long/
给出了方法:
find . -type f -delete find . -type d -print -delete
最好不要用-print参数看,没啥意思。直接df -i看呗!