由于业务需要,每天会上传上千万个压缩的日志包,在一次做临时处理的时候,需要将这些数据包从云存储上面下载下来,做处理,BUT,做完处理之后忘记将这些包删掉了,so,临时积累了好多包,磁盘的inode都满了,,后来想办法要删掉这些文件,rm -f 根本不管用,后来网上搜索了一下,用rsync命令进行删除操作,后来尝试了一下:
新建了一个空的文件夹:
mkdir empty
然后:
rsync --delete-before -d empty/ app/
rsync --delete-before -d empty/ portal/
将app文件夹和portal文件夹下的文件清空,后来试了一下确实好使,不过速度也确实需要等待一会。将文件清空了之后,发现文件夹的大小并没有改变(这个是记录磁盘文件夹文件的inode的文件么?),后来直接将文件夹删掉:
rm -rf app/
rm -rf portal/
这样算是彻底清空了。下面整理了一下关于rsync命令快速删除大量文件的说明:
1.----------------------------------------------------------
rsync --delete-before --force -r empty/ app/
选项说明:
--delete-before 接收者在传输之前进行删除操作
-r recurse into directories
注意:
empty是我们提前建立的文件夹,后面的/app是我们要删除的文件的所在目录。
当SRC和DEST文件性质不一致时将会报错
当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件
当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录
可能遇到的问题:
rsync 'cannot delete non-empty directory' errors, even with --force option
cannot delete non-empty directory
错误在同步source side的时候,你希望执行 rsync --delete
. Rsync 不会让你删除不包含在同步目录内的文件。添加 --delete-excluded
选项即可解决。
参考:
http://serverfault.com/questions/573392/rsync-cannot-delete-non-empty-directory-errors-even-with-force-option
http://blog.csdn.net/knowledgeaaa/article/details/41038967
2-------------------------------------------
rsync --delete-before -d -a -H -v --progress --stats empty/ app/
或者
rsync --delete-before -d /data/blank/ /var/edatacache/
这样/var/edatacache目录就被快速的清空了。
选项说明:
–delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
–stats 给出某些文件的传输状态
-d transfer directories without recursing
三、也可以用来删除大文件
假如我们在app/下有一个几十G甚至上百G的文件data.log,现在我们要删除它
1)、创建一个空文件
touch empty
2)、用rsync清空/root/data文件
rsync --delete-before -d --progess --stats empty/ app/data.log
注意:
当SRC和DEST文件性质不一致时将会报错
当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件
当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录
参考:http://www.xitongzhijia.net/xtjc/20150410/44874.html