我希望能够将多个目录中的文件同步到一个目录。如果我从源列表中删除一个目录,那么我希望从目标中删除该目录及其所有文件。
这是一个快速示例:
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
标志显然不起作用。您可以同步dir1
and的父目录的内容,而dir2
不是同步和。dir3
dir1
dir2
示例(使用 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-links
rsync
dir3
dir2
dir12/dir2
--delete
dir3/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/
要删除的所有目录的占位符。