it-swarm.cn

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

我已阅读以下主题:

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

您如何要求rsync复制文件并删除接收方(发送方不存在的文件),但有例外? (例如,即使发送方没有存储库,也不要在接收方删除Mercurial存储库.hg)。

一种可能性?

从下面的@Richard Holloway的答案中借用。说我有以下几行:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

据我了解,此行将使rsync删除发送路径上不存在的接收路径上的所有内容,但由dont_delete_me匹配的内容除外。我现在的问题是:rsync是否会在接收方保留与dont_delete_me匹配的文件,即使发送方没有匹配dont_delete_me ?

29
Amelio Vazquez-Reina

如果您使用--delete--exclude在一起,即使删除了源文件,排除位置中的内容也不会被删除。

但这引起了一个问题,就是根本不会文件夹rsync'。因此,您需要另一个rsync作业来sync该文件夹。

例如。

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

您可以用其他方式运行这些文件,但是这样会删除所有已删除的文件,然后替换它们,效率不高。

您不能作为一个班轮来做。

33
Richard Holloway

我发现以下解决方案适用于我的目的:

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”。

4
user2533809