Linux下一次删除百万文件
Linux下一次删除百万文件
线上环境遇到的一个问题,文件数量过多,执行rm命令报错
# rm -f ./*
-bash: /bin/rm: Argument list too long
根据报错检查状态
# ls | wc -l
634084
# du -sh
64G
在线下环境进行故障复现
测试环境准备
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 1.8T 331G 1.4T 20% /
tmpfs tmpfs 7.7G 0 7.7G 0% /dev/shm
/dev/sda1 ext4 190M 61M 120M 34% /boot
# grep name /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
model name : Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz
# free -m
total used free shared buffers cached
Mem: 15709 1643 14066 8 452 559
-/+ buffers/cache: 631 15078
Swap: 8191 0 8191
# cat /etc/redhat-release
CentOS release 6.8 (Final)
# uname -r
2.6.32-642.1.1.el6.x86_64
测试生成测试数据
# for i in `seq 1000000`;do echo “${i}” >> ${i}.txt;done
# ls | wc -l
1000000
# du -sh
3.9G .
# ls *.txt
-bash: /bin/ls: Argument list too long
# rm -f ./*
-bash: /bin/rm: Argument list too long
方法1:使用for循环方式执行删除任务
# time for i in `ls ./`;do rm -f ${i};done
real 58m44.234s
user 8m59.930s
sys 37m16.453s
时间太长了,绝壁不能忍
方法2:直接删目录
# time rm -rf test && mkdir test
real 0m56.768s
user 0m1.453s
sys 0m22.603s
# du -sh test
4.0K test
速度不错,然而很多情况下不能直接删目录,有点蛋疼
方法3:使用 find + xargs 组合命令执行删除任务(网上流传最多的方法)
# time find ./ -type f | xargs -n 1 rm -f
real 18m30.267s
user 0m9.536s
sys 1m38.999s
# time find ./ -type f | xargs rm -f
real 16m16.774s
user 0m2.232s
sys 0m30.454s
一样蛋疼,如果需求是删除全部文件的话,用这种方法就太low了,适合删除部分数据的场景
方法4:使用 ls + xargs 组合命令执行删除任务
# time ls | xargs -L 100 rm -f
real 1m3.801s
user 0m7.054s
sys 0m28.582s
# time ls | xargs -L 1000 rm -f
real 0m55.917s
user 0m5.322s
sys 0m24.778s
# time ls | xargs -L 2000 rm -f
real 0m55.560s
user 0m5.209s
sys 0m24.702s
# time ls | xargs -L 5000 rm -f
real 0m55.057s
user 0m5.196s
sys 0m24.666s
# time ls | xargs -L 10000 rm -f
real 0m55.733s
user 0m5.121s
sys 0m24.657s
# time ls | xargs -L 100000 rm -f
xargs: argument list too long
real 0m4.018s
user 0m3.324s
sys 0m0.701s
速度杠杠滴~~但是注意文件名长度,选择合适的传参数量
方法5:使用rsync命令来执行删除任务
# mkdir /tmp/Null
# time rsync –delete-before -d /tmp/Null/ ./
real 0m56.386s
user 0m1.767s
sys 0m28.075s
# ll
total 0
# du -sh ./
29M ./
没什么优点,缺点是rsync命令比较冷门,参数不容易记住,用的机会也不多,作为拓展方法了解一下就好
如果你有其他好的方法,可以一起探讨一下~~
原创文章,侵权必究