我已阅读这些主题:
但是,据我所知(也许我错过了一些东西),他们没有涵盖以下问题:
如何要求rsync
复制并删除接收端发送端不存在的文件(例外情况)? (例如,不要删除.hg
接收端的 Mercurial 存储库,即使发送端没有存储库)。
一种可能性?
借用@Richard Holloway 下面的答案。假设我有以下行:
rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path
据我了解,这一行将删除rsync
接收路径上发送路径上不存在的所有内容,除了dont_delete_me
.我现在的问题是: rsync 是否会在接收端保留与dont_delete_me
即使发送方没有任何匹配dont_delete_me
?
答案1
如果您同时使用--delete
和 ,--exclude
即使源文件被删除,排除位置中的内容也不会被删除。
但这提出了一个问题,即该文件夹根本不会被rsync
删除。因此,您将需要该文件夹rsync
的另一项工作sync
。
例如。
rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh
您可以以相反的方式运行这些文件,但它会删除所有已删除的文件,然后替换它们,这效率不高。
你不能将其作为一个衬垫来完成。
答案2
我发现以下解决方案适合我的目的:
rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest
(注意:添加-n
进行空运行的选项,并且不要更改--delete
为--delete-excluded
!)
运行该命令会产生以下属性:
- 源
src
目录保持不变 目标
dest
文件夹与源文件夹匹配,但以下情况除外:- 清单上的项目
do_not_send_to_dest
不会发送到目的地,并且 - 列表中的项目
do_not_modify_in_dest
在目标中保持不变。
- 清单上的项目
- (注意:不存在的项目在任何一个“ ”文件中列出都没有问题
do_not_
。)
解释
我猜当 rsync 从左到右读取命令行参数时,该--delete
参数似乎会导致 rsync 在内部“切换模式”(在某种意义上),允许再次使用该--exclude-from
选项,但具有不同的含义。
警告:
如果列表中的项目
do_not_send_to_dest
已存在于目标中,则:- 此命令不会从目标中删除该项目(除非首先从源目录中删除该项目)
- 警告:更改
--delete
为--delete-excluded
将删除两个列表中任一列表中列出的目标中的所有内容。 xD(也许 rsync 被编写为开放/灵活,但有一些细微差别?)
轻度使用测试。
我在用 ” rsync version 3.0.9 protocol version 30
”。