linux解决rm -rf删除大量文件很慢 实现快速删除

2020-03-06 13:14:59 | 编辑

在linux上使用rm -rf删除海量文件非常慢,慢到无法等待到结果,慢到无法接受,慢到怀疑生命。先分析一下为什么rm 删除文件慢,然后给出解决方法

1.为什么rm删除大量文件很慢

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


2.使用rsync解决删除慢的问题

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。

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

rsync删除文件的原理就是把一个空文件夹同步到有很多文件的文件夹

2.1安装rsync 命令

yum install rsync

2.2 rsync删除文件夹

先建立一个空目录

mkdir -p /root/blank

用rsync删除目标目录

rsync --delete-before -d /root/blank/ /root/edatacache/

这样/root/edatacache目录就被快速的清空了。

2.3 和删除有关的选项

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 files

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

2.4 rsync 选项参数说明

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

2.5 使用rsync删除大文件

和删除文件夹的原理一样

创建一个空文件

touch /root/empty.txt

用rsync清空/root/data.txt文件

rsync --delete-before -d --progess --stats /root/empty.txt /root/data.txt

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号