使用 rsync -a delete 删除包含大量文件的目录

Lil*_*lly 7 rsync

我有一个名为 的目录crmlogs,如何rsync -a --delete删除它?

mkdir emptydir
rsync -a --delete ./emptydir ./crmlogs
Run Code Online (Sandbox Code Playgroud)

小智 9

根据linuxnote.net\'s webarchiversync -aP \xe2\x80\x93delete empty/ ./dir删除大型目录最快的方法,大约比 withrm -rfv ./dir或 with快三倍find b/ -type f -delete

\n

因为它可能需要一段时间,所以详细的输出-P很方便,或者你永远盯着空的提示行......

\n

为了避免无休止的滚动,我将 STDOUT 重定向到awk在单行上显示输出(带有行计数器),如下所示:

\n
rsync -aP --delete ./emptyDir/ ./dir/ | awk \' { printf ( "\\r #%4d: %-200s", NR, $0 ) } \'\n
Run Code Online (Sandbox Code Playgroud)\n

要跳过权限被拒绝的行,请使用 sudo:

\n
sudo rsync -aP --delete ./emptyDir/ ./dir/ | awk\'{printf("\\r #%4d: %-200s",NR,$0)}\'\n
Run Code Online (Sandbox Code Playgroud)\n

解释:awk因为printf单独无法捕获 STDOUT,\\r因此要将光标设置在输出行的开头,NR对于行#计数器并%4d右填充行#,%-200s对于 200 个字符的输出字符串右填充覆盖前一行(如果终端窗口至少有这个宽度,则为 200)

\n


Mis*_*jay 5

交换机--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 ../
Run Code Online (Sandbox Code Playgroud)

请注意,rsync -a --delete foo barorrsync -a --delete ./foo ./bar只是将一个副本放在foo下面bar

从您的后续评论来看,我不确定您是否真的想要删除该crmlogs目录,或者只是清除源中可能不再存在的某些日志文件。如果是这样,--delete一旦这些文件从源文件夹中删除,该开关应该对您有用。