Michael_Tong
近期目标:按时吃药,努力做个正常人。

今天做了个测试,生成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看呗!

posted on 2018-01-25 20:36  Michael_Tong唐唐  阅读(214)  评论(0编辑  收藏  举报