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命令比较冷门,参数不容易记住,用的机会也不多,作为拓展方法了解一下就好

 

如果你有其他好的方法,可以一起探讨一下~~

 

 

原创文章,侵权必究

 

Hadoop编译源码

1.1 前期准备工作 1)CentOS联网 配置CentOS能连接外网。最好是用新克隆的虚拟机 注意:采用root角色编译,减少文件夹权限出现问题 2)jar包准备(hadoo...

简单的Linux命令笔记

ls -l 详细信息ls /dev/ -ls 很详细ls -a 显示隐藏ls -lh 方便看ls -lh –sort=size 按大小排序.开头的都是隐藏 cd /media/ 进入cd .. 上一级pwd 当前工...

Linux常用基本命令[find]用法(1)

find是个很强大的命令,用法很多。 作用:查找目录下的文件,同时也可以调用其他命令执行相应的操作 用法: find [选项] [路径][操作语句] find [-H] [-L] [-...

linux系统开机流程详解

今天,我们主要来谈谈计算机系统的启动流程,在此借用网络上的一张图来说明整个流程: 1、BIOS启动 BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的...

makefile中的一些参数说明

#obj = main.o sub.o add.o div.o mul.osrc = $(wildcard *.c) #搜索.c文件 可以加路径 obj = $(patsubst %.c, %.o, $(src))#字符匹配替换,将src中所有.c...

Linux下设置共享目录

Linux系统的文件或目录的共享功能是非常强大,而且是非常灵活的,其对权限的控制可以做到非常的细致,当然如果你是通过命令行方式进行设置的 话,那么对...