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


29

我已阅读以下主题:

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

您如何要求rsync复制文件并删除发送方不存在的接收方文件(例外)?(例如.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吗?

Answers:


33

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

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

例如。

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

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

您不能作为一个班轮做。


谢谢@理查德。您的回答使我觉得我原来的问题可能比我想的要容易。如果我使用单行:rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path,那将不会rsync删除接收路径上发送路径上不存在的所有内容,除非匹配的内容是dont_delete_me?最重要的是,即使发送方没有rsync匹配,接收方的内容dont_delete_me 也会匹配dont_delete_me吗?如果是这样,我认为这是我唯一需要的电话,对吗?
Amelio Vazquez-Reina

您是正确的,但是如果一行完成,则不会获得新文件和对dont_delete_me文件夹的更改。如果您不想同步更改和添加,则可以按此处所述使用--exclude标志。
理查德·霍洛威

@AmV --delete除非明确指定,否则不会删除被排除的文件--delete-excluded。请参见rsync手册中对--delete和的描述--delete-excluded
吉尔(Gilles)'所以

4

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.