要测试删除大量小文件,首先需要先创建大量小文件,比如创建50W个txt文件:

mkdir /tmp/temp && cd /tmp/temp

seq -f "%g.txt" 1 500000 | xargs -P 4 -n 10000 touch

最快的是直接rm删除目录(但并非是瞬间的),是删除速度的极限。

方法一:使用rsync

$ mkdir /tmp/empty

$ time rsync -r --delete /tmp/empty/ /tmp/temp/

real 0m8.556s

user 0m0.239s

sys 0m7.380s

方法二:使用Perl

$ cd /tmp/temp/

$ time perl -e 'unlink for (<"*">)'

real 0m8.773s

user 0m0.281s

sys 0m7.582s

方法三:使用Ruby

$ cd /tmp/temp/

$ time ruby -e 'Dir["*.txt"].each {|x| File.unlink x}'

real 0m8.882s

user 0m0.613s

sys 0m7.429s

$ time ruby -e 'Dir.each_child(".") {|f| File.unlink "/tmp/temp/"+f}'

real 0m6.999s

user 0m0.443s

sys 0m5.912s

方法四:使用Python

$ cat a.py

import os

dir = "/tmp/temp/"

for file in os.listdir(dir):

os.unlink(dir+file)

$ time python3 a.py

real 0m6.417s

user 0m0.339s

sys 0m5.451s

方法五:使用find结合xargs

# 4个rm进程(我只有4核),每次删一个文件

$ time bash -c 'find /tmp/temp/ -type f -print0 | xargs -0 -P4 -i rm -rf {}'

real 2m51.573s

user 0m3.104s

sys 3m59.286s

# 4个rm进程(我只有4核),每次删20000个文件

# 和-n的数量也有关系

$ time bash -c 'find /tmp/temp/ -type f -print0 | xargs -0 -P4 -n20000 rm -rf'

real 0m12.746s

user 0m0.282s

sys 0m19.133s

# 直接使用find -delete,相比xargs -P,可能更快,可能更慢,跟find版本有关

# 对于较新的find版本来说,由于存在额外的优化,find -delete可能达到了删除文件速度的极致,

# 能够达到和rm删除目录不相上下的速度(rm删除目录时会先删除目录中的每一个文件,再删除空目录本身,所以和find一样也存在遍历目录的过程)

$ time bash -c 'find /tmp/temp -type f -delete'