在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