要求 rsync 在接收端删除发送端不存在的文件,但接收端有例外

要求 rsync 在接收端删除发送端不存在的文件,但接收端有例外

我已阅读这些主题:

但是,据我所知(也许我错过了一些东西),他们没有涵盖以下问题:

如何要求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”。

相关内容