今天我们来测试一下Linux下面删除大量文件的效率。
首先建立50万个文件
$ test for i in $(seq 1 500000);do echo text >>$i.txt;done
测试目录:/home/test
模拟写入3000万个空文件:
echo test{01..30000000} | xargs touch
结果把inode都给占满了:
查看创建的空文件 :
#time find . -type f -empty |wc -l
rm删除
$ time rm -f *
zsh: sure you want to delete all the files in /home/hungerr/test [yn]? y
zsh: argument list too long: rm
rm -f * 3.63s user 0.29s system 98% cpu 3.985 total
由于文件数量过多,rm不起作用。
或者
#rm -rf *.*
#s | xargs rm -rf
提示内存已被耗尽。
正确的删除方式:
1.直接删除父目录(速度:很慢)
[root@localhost home]# rm -rf test/
耗时39分钟
2.使用find命令配合 -delete 选项(速度:最慢!)
由于是空文件,这里使用-empty选项,实际应用场景应该使用-size 选项来指定文件大小进行删除
最快最推荐的方法(速度:极快):
创建一个空文件夹,使用rsync -a --delete选项,将空文件夹内容与目标文件夹进行同步
find删除
$ time find ./ -type f -exec rm {} \;
find ./ -type f -exec rm {} \; 49.86s user 1032.13s system 41% cpu 43:19.17 total
大概43分钟,我的电脑。。。。。。边看视频边删的。
find with delete
$ time find ./ -type f -delete
find ./ -type f -delete 0.43s user 11.21s system 2% cpu 9:13.38 total
用时9分钟。
rsync删除
# 首先建立空文件夹blanktest
$ time rsync -a --delete blanktest/ test/
rsync -a --delete blanktest/ test/ 0.59s user 7.86s system 51% cpu 16.418 total
16s,很好很强大。
Python删除
import os
import timeit
def main():
for pathname,dirnames,filenames in os.walk('/home/username/test'):
for filename in filenames:
file=os.path.join(pathname,filename)
os.remove(file)
if __name__=='__main__':
t=timeit.Timer('main()','from __main__ import main')
print t.timeit(1)
1
2
$ python test.py
529.309022903
大概用时9分钟。
Perl删除
$ time perl -e 'for(<*>){((stat)[9]<(unlink))}'
perl -e 'for(<*>){((stat)[9]<(unlink))}' 1.28s user 7.23s system 50% cpu 16.784 total
16s,这个应该最快了。
结果:
rm:文件数量太多,不可用
find with -exec 50万文件耗时43分钟
find with -delete 9分钟
Perl 16s
Python 9分钟
rsync with -delete 16s
结论:删除大量小文件rsync最快,最方便。
rsync是最快的方法,当然如果会使用Perl的话,还可以更快,但是并不是所有人都会,所以介绍一个最容易上手的方法。
不想介绍rm 和 find 这两种方法(即慢又不实用),但是为了严谨的告诉大家rsync比较好,所以就都贴上测试图片啦。
Linux 删除目录下文件的 10 种方法
删除当前目录下的文件
1.rm -f *
#最经典的方法,删除当前目录下的所有类型的文件
2.find . -type f -delete或find . -type f -exec rm -f {} ;
#用find命令查找普通文件并删除or用find命令的处理动作将其删除
3.find . -type f | xargs rm -f
#用于参数列表过长;要删除的文件太多
4.rm -f find . -type f
#删除全部普通文件
5.for delete in ls -l
;do rm -f * ;done
#用for循环语句删除当前目录下的所有类型的文件
删除指定目录下的文件
1.rm -f 指定目录*
#最经典的方法,删除指定目录下的所有类型的文件
2.find 指定目录 -type f -delete或find 指定目录 -type f -exec rm -f {} ;
#用find命令查找指定目录下的所有普通文件并删除or用find命令的处理动作将其删除
3.find 指定目录 -type f | xargs rm -f
#用于参数列表过长;要删除的文件太多
4.rm-f find 指定目录 -type f
#删除指定目录下的全部普通文件
5.for delete in ls –l 指定目录路径
;do rm -f * ;done
#用for循环语句删除指定目录下的所有类型的文件
参考链接 :
Linux 删除目录下文件的 10 种方法 :https://mp.weixin.qq.com/s/GuEUrnBJzvcOSq5A2VuXvg
作者:ZYJTF_Zhang
链接:https://blog.51cto.com/zhangdaifu/1933091
Linux 下删除大量文件效率对比,看谁删的快! :https://mp.weixin.qq.com/s/SMTZrBi20ijeWFhg0udONA
http://www.safebase.cn/article-260775-1.html