![使用 rsync -a delete 删除包含大量文件的目录](https://linux22.com/image/80749/%E4%BD%BF%E7%94%A8%20rsync%20-a%20delete%20%E5%88%A0%E9%99%A4%E5%8C%85%E5%90%AB%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我有一个名为 的目录crmlogs
,如何rsync -a --delete
删除它?
mkdir emptydir
rsync -a --delete ./emptydir ./crmlogs
答案1
根据linuxnote.net 的 webarchive是删除大型目录最快的方法,大约比 with或 withrsync -aP –delete empty/ ./dir
快三倍rm -rfv ./dir
find b/ -type f -delete
因为它可能需要一段时间,所以详细的输出-P
很方便,或者你永远盯着空的提示行......
为了避免无休止的滚动,我将 STDOUT 重定向到awk
在单行上显示输出(带有行计数器),如下所示:
rsync -aP --delete ./emptyDir/ ./dir/ | awk ' { printf ( "\r #%4d: %-200s", NR, $0 ) } '
用于跳过没有权限行,使用 sudo:
sudo rsync -aP --delete ./emptyDir/ ./dir/ | awk'{printf("\r #%4d: %-200s",NR,$0)}'
解释:awk
因为printf
单独不能捕获 STDOUT,所以\r
要将光标设置在输出行的开头,NR
对于行#计数器并%4d
右填充行#,%-200s
对于 200 个字符的输出字符串右填充覆盖前一行(如果终端窗口至少有这个宽度,则为 200)
答案2
交换机--delete
从目标中删除源中不存在的文件。如果要删除crmlogs
,则需要从不包含该目录的源进行复制。您的示例显示您rsync
在根目录下的两个目录之间使用。在这个例子中更容易看到/tmp
:
/tmp $ cd tmp
/tmp $ mkdir foo
/tmp $ mkdir bar
/tmp $ mkdir bar/crmlogs
/tmp $ rsync -a --delete foo/ bar/
/tmp $ ls -l bar
total 0
drwxr-xr-x 2 mint mint 40 Jan 10 23:19 ./
drwxrwxrwt 10 root root 220 Jan 10 23:19 ../
请注意,rsync -a --delete foo bar
orrsync -a --delete ./foo ./bar
只是将一个副本放在foo
下面bar
。
从您的后续评论来看,我不确定您是否真的想要删除该crmlogs
目录,或者只是清除源中可能不再存在的某些日志文件。如果是这样,--delete
一旦这些文件从源文件夹中删除,该开关应该对您有用。