前言

注意本文说的“海量”并不是指体积大,而是指数量,比如一个目录下有数百万个小文件。最近在优化服务器时发现postfix下的maildrop目录和clientmqueue目录还有var目录下发现有大量的文件,进入这些目录里使用ls命令是愚蠢的做法,而直接执行rm * , 没有任何反应,文件数量也没有减少,也就是说,在海量文件目录里直接使用rm命令进行删除是无效的。

常规方法:

那么正确的方法是什么呢?有两种方法可选:

第一种:

1

find /path/to/directory -type f -exec rm {} \;

第二种:

2

ls -1 /path/to/directory | xargs -I{} rm {}

一、快速删除大量/散/海量文件/碎片化的文件

方法1、快速删除大量文件:

假如你要在linux下删除大量文件,比如100万、1000万,像/var/spool/clientmqueue/的mail邮件,/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf *可能就不好使了。 rsync 可以用来清空目录或文件,如下:

1)先建立一个空目录

mkdir -p /data/blank

2)用rsync删除目标目录

rsync--delete-before -d /data/blank/ /var/spool/clientmqueue/

这样目标目录很快就被清空了

注:其中--delete-before 接收者在传输之前进行删除操作

不要忘记文件夹后的“/”附:rsync的跟删除相关的参数
rsync --help | grep delete --del                   an alias for --delete-during --delete                delete files that don't exist on the sending side --delete-before         receiver deletes before transfer (default) --delete-during         receiver deletes during transfer, not before --delete-after          receiver deletes after transfer, not before --delete-excluded       also delete excluded files on the receiving side --ignore-errors         delete even if there are I/O errors --max-delete=NUM        don't delete more than NUM filesrsync --delete-before -a -H -v --progress --stats /tmp/test/ log/

这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。

选项说明
–delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
–stats 给出某些文件的传输状态

方法2、快速删除大量文件:

直接进入到对应的目录,然后执行命令,快速删除大量散文件和重复碎片化文件

ls | xargs -n 10 rm -rf

二、快速删除大文件或者大容量内容文件

方法1、快速删除大文件:

假如你有一些特别大的文件要删除,比如nohup.out这样的实时更新的文件,动辄都是几十个G上百G的,也可以用rsync来清空大文件,而且效率比较高。

1)创建空文件

touch/data/blank.txt

2)用rsync清空文件

rsync-a  --delete-before --progress --stats /root/blank.txt  /root/nohup.out

方法2、通过重定向到 Null 来清空文件内容清空或者让一个文件成为空白的最简单方式,是像下面那样,通过 shell 重定向 null (不存在的事物)到该文件:

# > access.log

方法3、使用符号或者命令(实际上就是用命令写入覆盖0内容),例如:

:符号# : > access.log # true > access.log命令写入# cat /dev/null > access.log
# cp /dev/null access.log
# dd if=/dev/null of=access.log# echo "" > access.log 或者 # echo > access.log
# echo -n "" > access.log# truncate -s 0 access.log
上面这两种方法可以成功的删除海量文件,速度也很快。但还有一种更好的方法,比如要删除上面提到的clientmqueue目录,里面全部是一个一个的邮件,用下面的方法:service sendmail stop
cd /var/spool
mv clientmqueue clientmqueue-todelete
mkdir clientmqueue
chown --reference=clientmqueue-todelete clientmqueue
chmod --reference=clientmqueue-todelete clientmqueue
service sendmail start
rm -rf clientmqueue-todelete上面的方法是将目录重命名,然后使用了 --reference 引用参数来重建目录,然后删除重命名的目录。直接删除目录的方法速度是十分的快。也可以留着备份不删。更安全。

三、思考为什么这些工具/命令能够做到快速删除(原理)

3、为什么rsync能够快速删除大文件?

1)rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。

2)rsync所做的系统调用很少:没有针对单个文件做lstat和unlink操作。命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink。

另外,在其他人的评测里,rm的上下文切换比较多,会造成System CPU占用较多——对于文件系统的操作,简单增加并发数并不总能提升操作速度。

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流

频繁做减法不如直接从头来过

把文件系统的目录与书籍的目录做类比,rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复操作很多次;rsync删除内容时,建立好新的空目录,替换掉老目录,基本没开销。

【参考资料】Linux 下清空或删除大文件/大量文件的几种方法_linux 清空文件夹 https://blog.csdn.net/sd4493091/article/details/80414053

Linux服务器操作系统快速删除大量/大文件相关推荐

  1. linux 快速删除大量/大文件

    linux 快速删除大量/大文件 经常会测试海量大数据,在不同文件系统下执行列出(list),删除(rm)等操作的执行时间,下面列出了,执行删除50万个文件时,使用不同的命令或者脚本,执行时间! 从上 ...

  2. 服务器磁盘空间占用,大文件查找

    记一次Linux服务器磁盘空间占用,大文件查找 du -h --max-depth=1 好久没写东西了,很久之前弄了个服务器玩玩,写了点东西在上面放着,一直在不停的抓数据,也就没怎么看,最近闲来无事登 ...

  3. rm如何在Linux中删除一个大文件

    rm -rf命令是删除文件夹及其内容最快的方式之一. 仅仅一丁点的敲错或无知都可能导致不可恢复的系统崩坏. 下列是一些rm 命令的选项: rm 命令在Linux下通常用来删除文件. rm -r 命令递 ...

  4. Linux 快速删除大量小文件方法

    Linux 快速删除大量小文件方法     当我们在linux系统中要删除数万或者数十万甚至数百万的文件时使用rm -rf *就不太好用,因为要等待很长一段时间.在这种情况之下我们可以使用linux系 ...

  5. 红旗linux服务器操作系统 Asianux V8.1 (欧拉版) 系统安装

    红旗linux服务器操作系统 Asianux V8.1 (openEuler欧拉版) 系统安装 前言: 系统官方介绍: ​ 2021 年 3 月 16 日,由中科红旗(北京)信息科技有限公司研发的红旗 ...

  6. Ubuntu快速删除大量小文件方法

    进行以下两步操作即可: 1.第一步:创建空的文件夹: mkdir /tmp/blank 2.第二步:执行以下命令:rsync --delete-before -d /tmp/blank/ /home/ ...

  7. 服务器系统报错kernel-power,第十二讲、Linux服务器操作系统1.ppt

    第十二讲.Linux服务器操作系统1.ppt 4.1引导与关闭系统 4.1.1 GRUB引导器 GRUB简介 1)grub?是一个多重启动管理器.grub是GRand?Unified?Bootload ...

  8. 电脑删除了大文件怎么恢复?看看这四种方法

    电脑能够帮助我们存储大量的文件,比如视频.文档.音频等,但是随着时间的流逝,有些文件所存在的意义也变得毫无价值了,这时候很多小伙伴都会选择删除操作,可是由于电脑磁盘内容过多,容易面临重要文件被误删除的 ...

  9. php读取csv指定行_PHP快速读取CSV大文件指定行

    1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办 ...

最新文章

  1. js基础练习题 二次封装函数
  2. Boost:path的测试程序
  3. linux解决软件依赖的命令,通过yum解决软件的依赖关系
  4. 苹果电脑可以装windows系统吗_不只是桌面,这个 Windows 皮肤可以帮你全局美化 Windows 系统
  5. 修改MYSQL密码及权限
  6. 计算机基础及linux入门
  7. linux 模拟打电话,Android 调用打电话和发短信功能
  8. RGB颜色值与十六进制颜色码转换工具
  9. idou老师教你学istio :基于角色的访问控制
  10. 10G SR光模块取消ER调试可行性分析
  11. 常见的互联网名词 O2O、B2B、C2C等
  12. Lab: Cross-site WebSocket hijacking:跨站WebSocket劫持
  13. windows 98 设置 TEMP 环境变量时的一个有趣现象
  14. 计算机程序必须具有硬盘才能工作吗,2016年3月计算机一级考试WPS试题及答案
  15. 如何正确认识优越感和自卑感
  16. Vim q-quit - 用 q 键关闭窗口
  17. Netflix 增长的逻辑——第二曲线(混沌2018年度大课笔记1)
  18. STC12C5A60S2单片机WIFI信号扫描报警监视系统信号增强信号过低报警
  19. 基于少量样本的快速学习Few-shot learning
  20. 洛谷P1118 [USACO06FEB]数字三角形Backward Digit Su…

热门文章

  1. Graph Self-Supervised Learning: A Survey
  2. src refspec xxx does not match any 错误处理办法
  3. linux里的计划任务
  4. 【python基础】python中常用字符串函数详解
  5. IntelliJ IDEA历史版本官网下载地址
  6. android定位周边,Android 使用高德SDK编写周边搜索定位
  7. 设置漂亮的eclipse主题(Theme)风格
  8. 并查集(Union-Find) (图文详解)
  9. 【C语言】for循环常见问题
  10. AD6.9原理图打印去除背景色