rsync快速删除海量文件
由于业务侧使用时,一些脚本文件写的不够严谨,造成/var/spool/postfix/maildrop/目录经常被用户通知邮件文件堆满。而通过rm -rf * 删除时,会提示-bash: /bin/rm: Argument list too long 。通过ls |xargs rm -rf 进行删除时也耗时较长,这里可以通过rsync进行删除。
一、rsync删除文件
针对上面的问题,我们可以通过以下方法清空该目录:
1先创建一个空目录
2# mkdir /tmp/empty/
3清空目标目录
4# rsync --delete-before -avH --progress --stats /tmp/empty/ /var/spool/postfix/maildrop
选项说明:
1-delete-before 接收者在传输之前进行删除操作
2–progress 在传输时显示传输过程
3-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
4-H 保持硬连接的文件
5-v 详细输出模式
6–stats 给出某些文件的传输状态
不过在使用上面的命令进行清理时,存在一个问题,清空后,目标目录的权限会和源目录的权限一样。如:/tmp/empty是root:root,而maildrop之前是postfix:postdrop ,执行之后也会maildrop目录的权限也会变成root:root 。由于-a权限是-rlptogD几个参数的集合,所以可以将og(owner:group)两个参数去掉。清空时自动保持之前的目录权限,如下:
1# rsync --delete -rlptD /tmp/empty/ /var/spool/postfix/maildrop/
二、rsync与rm 删除速度比较
便于说明问题,我在一台主机上创建5万个空文件后再分别用rsync和rm 进行清理,以下是测试结果:
1[root@www data1]# mkdir -p /tmp/empty/
2[root@www data1]# mkdir 361way;seq 1 50000 | xargs -I{} touch 361way/file_{}
3[root@www data1]# time rsync --delete -rlptD /tmp/empty/ /data1/361way/
4real 0m0.149s
5user 0m0.018s
6sys 0m0.091s
7[root@www data1]# seq 1 50000 | xargs -I{} touch 361way/file_{}
8[root@www data1]# time rm -rf 361way/*
9real 0m0.831s
10user 0m0.366s
11sys 0m0.464s
对比结果已经比较能说明问题了吧。
为什么rsync这么快呢?
rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复操作很多次;rsync删除内容时,建立好新的空目录,替换掉老目录,基本没开销。想要深层次的区分两个命令在调用系统函数时的区别,可以使用SystemTap工具进行分析(由于本人也不懂该工具的使用,所以这里就不献丑了)。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/rsync-fast-del-file/4681.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.