如何使 rsync 从目标中删除不在源列表中的目录

如何使 rsync 从目标中删除不在源列表中的目录

我希望能够将多个目录中的文件同步到一个目录。如果我从源列表中删除一个目录,那么我希望从目标中删除该目录及其所有文件。

这是一个快速示例:

mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3

dir3 现在包含“dir1/file1”和“dir2/file2”。

如果我再次 rsync,并从列表中删除 dir2:

rsync -a dir1 dir3

然后我想从目标中删除 dir2/file2 和 dir2 。

rsync 的 --delete 选项仅处理 dir1 和 dir3/dir1 之间的删除,因此 dir2 保留(即使使用 --delete)。

我已经浏览了 rsync 手册页中的各种选项,但没有看到任何选项告诉 rsync “组合”所有源并将它们视为“一”树,以便“--delete”执行我想要它做什么。然而,我非常有信心我不是第一个想做这样的事情的人。

有想法吗?

答案1

如果您将多个源目录同步到一个目标目录,则该--delete标志显然不起作用。您可以同步dir1and的父目录的内容,而dir2不是同步和。dir3dir1dir2

示例(使用 rsync 标志-i查看更改):

$ mkdir -p dir12/dir1 dir12/dir2 dir3
$ touch dir12/dir1/file1 dir12/dir2/file2
$ rsync -ai dir12/ dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
# BEFORE: dir1 and dir2 were synced to dir3
$ rm -rf dir12/dir2
$ rsync -ai --delete dir12/ dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./
# AFTER: dir3/dir2 is gone

如果您没有公共父目录,则dir12/dir2可能是指向真实目录的符号链接。在第一次调用中使用选项-L( ),您将获得与目录相同的目录结构(而不​​是符号链接)。删除符号链接并再次与目录同步后,就会像示例中那样消失。--copy-linksrsyncdir3dir2dir12/dir2--deletedir3/dir2

编辑:

我摆弄了一下,可能发现了一个黑客:

$ mkdir empty dir1 dir2 dir3
$ touch dir1/file1 dir2/file2
$ rsync -ai dir1 dir2 dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
$ rsync -ai --delete empty/ dir1 dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./

用作empty/要删除的所有目录的占位符。

相关内容