Linux服务器操作系统快速删除大量/大文件
前言
注意本文说的“海量”并不是指体积大,而是指数量,比如一个目录下有数百万个小文件。最近在优化服务器时发现postfix下的maildrop目录和clientmqueue目录还有var目录下发现有大量的文件,进入这些目录里使用ls
命令是愚蠢的做法,而直接执行rm *
, 没有任何反应,文件数量也没有减少,也就是说,在海量文件目录里直接使用rm
命令进行删除是无效的。
常规方法:
那么正确的方法是什么呢?有两种方法可选:
第一种:
1 |
|
第二种:
2 |
|
一、快速删除大量/散/海量文件/碎片化的文件
方法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服务器操作系统快速删除大量/大文件相关推荐
- linux 快速删除大量/大文件
linux 快速删除大量/大文件 经常会测试海量大数据,在不同文件系统下执行列出(list),删除(rm)等操作的执行时间,下面列出了,执行删除50万个文件时,使用不同的命令或者脚本,执行时间! 从上 ...
- 服务器磁盘空间占用,大文件查找
记一次Linux服务器磁盘空间占用,大文件查找 du -h --max-depth=1 好久没写东西了,很久之前弄了个服务器玩玩,写了点东西在上面放着,一直在不停的抓数据,也就没怎么看,最近闲来无事登 ...
- rm如何在Linux中删除一个大文件
rm -rf命令是删除文件夹及其内容最快的方式之一. 仅仅一丁点的敲错或无知都可能导致不可恢复的系统崩坏. 下列是一些rm 命令的选项: rm 命令在Linux下通常用来删除文件. rm -r 命令递 ...
- Linux 快速删除大量小文件方法
Linux 快速删除大量小文件方法 当我们在linux系统中要删除数万或者数十万甚至数百万的文件时使用rm -rf *就不太好用,因为要等待很长一段时间.在这种情况之下我们可以使用linux系 ...
- 红旗linux服务器操作系统 Asianux V8.1 (欧拉版) 系统安装
红旗linux服务器操作系统 Asianux V8.1 (openEuler欧拉版) 系统安装 前言: 系统官方介绍: 2021 年 3 月 16 日,由中科红旗(北京)信息科技有限公司研发的红旗 ...
- Ubuntu快速删除大量小文件方法
进行以下两步操作即可: 1.第一步:创建空的文件夹: mkdir /tmp/blank 2.第二步:执行以下命令:rsync --delete-before -d /tmp/blank/ /home/ ...
- 服务器系统报错kernel-power,第十二讲、Linux服务器操作系统1.ppt
第十二讲.Linux服务器操作系统1.ppt 4.1引导与关闭系统 4.1.1 GRUB引导器 GRUB简介 1)grub?是一个多重启动管理器.grub是GRand?Unified?Bootload ...
- 电脑删除了大文件怎么恢复?看看这四种方法
电脑能够帮助我们存储大量的文件,比如视频.文档.音频等,但是随着时间的流逝,有些文件所存在的意义也变得毫无价值了,这时候很多小伙伴都会选择删除操作,可是由于电脑磁盘内容过多,容易面临重要文件被误删除的 ...
- php读取csv指定行_PHP快速读取CSV大文件指定行
1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办 ...
最新文章
- js基础练习题 二次封装函数
- Boost:path的测试程序
- linux解决软件依赖的命令,通过yum解决软件的依赖关系
- 苹果电脑可以装windows系统吗_不只是桌面,这个 Windows 皮肤可以帮你全局美化 Windows 系统
- 修改MYSQL密码及权限
- 计算机基础及linux入门
- linux 模拟打电话,Android 调用打电话和发短信功能
- RGB颜色值与十六进制颜色码转换工具
- idou老师教你学istio :基于角色的访问控制
- 10G SR光模块取消ER调试可行性分析
- 常见的互联网名词 O2O、B2B、C2C等
- Lab: Cross-site WebSocket hijacking:跨站WebSocket劫持
- windows 98 设置 TEMP 环境变量时的一个有趣现象
- 计算机程序必须具有硬盘才能工作吗,2016年3月计算机一级考试WPS试题及答案
- 如何正确认识优越感和自卑感
- Vim q-quit - 用 q 键关闭窗口
- Netflix 增长的逻辑——第二曲线(混沌2018年度大课笔记1)
- STC12C5A60S2单片机WIFI信号扫描报警监视系统信号增强信号过低报警
- 基于少量样本的快速学习Few-shot learning
- 洛谷P1118 [USACO06FEB]数字三角形Backward Digit Su…