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

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

原创文章,侵权必究

Linux下一次删除百万文件的更多相关文章

  1. Linux服务器删除乱码文件和文件夹的方法

    Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...

  2. Linux上删除大量文件几种方式对比

    目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...

  3. linux下删除大量文件提示参数过长解决办法

    linux下删除大量文件提示参数过长解决办法:在当前目录下rm -rf * 在linux中删除大量文件时,直接用rm会出现:-bash: /bin/rm: 参数列表过长的错误. 这时可以用find命令 ...

  4. Linux下删除大量文件效率对比

    来自公众号:马哥Linux运维 今天我们来测试一下Linux下面删除大量文件的效率. 首先建立50万个文件 $ test   for i in $(seq 1 500000);do echo text ...

  5. Linux下删除的文件如何恢复

    Linux下删除的文件如何恢复 参考自: [1]linux下误操作删除文件如何恢复 [2]Linux实现删除撤回的方法 以/home/test.txt为例 1.df -T 文件夹 找到当前文件所在磁盘 ...

  6. 如何恢复 Linux 上删除的文件,第 1 部分

    来源:http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/ 原理及普通文件的恢复 要想恢复误删除的文件,必须清楚数据在磁盘上究竟是如何存储的 ...

  7. linux下删除乱码文件、目录

    由于编码原因,在linux服务器上上传.创建中文文件或目录时,会产生乱码,如果想删除它,发现用rm命令是删除不了的 这种情况下,用find命令可以删除乱码的文件或目录. 首先进入乱码文件或目录所在的目 ...

  8. linux 下删除乱码文件-乾颐堂

    在linux下删除文件,遇到特殊字符是一件非常头疼的事情. 1. 如果文件名带 ‘-’ 或者‘--’这样的字符 删除办法为:rm -- 文件名 如文件名为:-pythontab.tgz 如果用普通方法 ...

  9. Linux rm 删除指定文件外的其他文件 方法汇总

    一.Linux下删除文件和文件夹常用命令如下: 删除文件: rm file 删除文件夹: rm -rf dir 需要注意的是, rmdir 只能够删除 空文件夹 . 二.删除制定文件(夹)之外的所有文 ...

随机推荐

  1. ZOJ 3777-Problem Arrangement(状压DP)

    B - Problem Arrangement Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %l ...

  2. hive的简单理解--笔记

    Hive的理解 数据仓库的工具  Hive仅仅是在hadoop上面包装了SQL: Hive的数据存储在hadoop上 Hive的计算由MR进行 Hive批量处理数据  Hive的特点 1 可扩展性(h ...

  3. 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述

    写博客之前总想说点什么,但写的时候又忘了想说点什么,算了,不说了,还是来送福利吧. 今天是来分享我在平时工作中搭建的一套前后端分离的框架. 平时工作大多时候都是在做管理类型的软件开发,无非就是增.删. ...

  4. phpstorm2016.3+xdebug调试

    1.首先打开PHP配置文件,php.in修改相关xedebug配置 ; XDEBUG Extension [xdebug] zend_extension ="d:/wamp64/bin/ph ...

  5. php正则表达式,在抓取内容进行匹配的时候表现不稳定

    最近做了一个 抓取内容的程序,使用php的正则表达式对抓取的内容进行匹配,当进行大量匹配运算的时候,发现偶尔会出现匹配失败的情况.检查不出任何原因. 匹配失败导致匹配结果为空,最终导致写入数据库失败. ...

  6. 零基础如何迅速学习HTML5?新手小白学习web前端H5自白!

    很多的人在毕业之后才发现原来学的专业不是自己想做的工作,或者专业对口的工作待遇让人觉得并不满意,于是很多人选择培训机构学新的一门技能转换行业.IT行业的web前端H5受到很多学员的青睐.那么学习web ...

  7. sql分区文件删不的可能解决方法

    删除数据库分区的时候报错如下: ALTER DATABASE [ITMP2] remove FILE F20170427Msg 5042, Level 16, State 1, Line 1The f ...

  8. ImageAnimator类方法(动画设计)

    ImageAnimator类常用方法如表所示. 表    ImageAnimator类常用方法 方法 说明 Animate 将多帧图像显示为动画 CanAnimate 返回一个布尔值,该值指示指定图像 ...

  9. 32.Linux-2440下的DMA驱动(详解)

    DMA(Direct Memory Access) 即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM .I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大 ...

  10. 《阿里巴巴Java工作手册》学习笔记

    最近浏览了一下阿里巴巴的Java开发手册,感觉内容确实非常的赞,发现了不少自己在编程中的误区,因此决定通过成文牢固掌握,文中将选取个人认为比较重要的部分进行描述与分析."愿站在巨人的肩膀上, ...