rsync 删除选项之间有什么区别?

Ski*_*ick 156 rsync

我在rsync 手册页上看到有很多delete选项,但并不真正了解它们之间的区别。这些选项之间有什么区别?

 --del                   an alias for --delete-during
 --delete                delete extraneous files from dest dirs
 --delete-before         receiver deletes before transfer (default)
 --delete-during         receiver deletes during xfer, not before
 --delete-delay          find deletions during, delete after
 --delete-after          receiver deletes after transfer, not before
 --delete-excluded       also delete excluded files from dest dirs
Run Code Online (Sandbox Code Playgroud)

Sat*_*ppy 157

  • --del/--delete_during:在复制文件时从目标目录中删除文件(与--delete-before--delete-before进行单独扫描以查找可删除文件相比,节省内存)

  • --delete: 如果源目录中不存在目标目录中的文件,则删除它们。

  • --delete-before: 在从源目录复制同名文件之前删除目标目录中的文件

  • --delete-during: 删除目标目录中的文件,同时从源目录复制同名文件

  • --delete-delay: 传输过程中标记删除,但等待传输完成

  • --delete-after: 接收器在传输后删除,而不是之前...如果 rsync 的其他部分将额外的文件移到别处,你会想要这个而不是--delete-delay,因为--delete-delay决定在传输过程中要删除的内容,而--delete-after检查文件目录应该在一切完成后删除。

  • --delete-excluded:从目标目录中删除明确排除在从源目录传输之外的文件。

rsync 的重点不是复制,而是存档。这是一个重要的区别。处理已删除/更改的文件至关重要,并且在许多情况下是细微差别的。

--delete特别是这面旗帜是我见过多次搞砸的旗帜。许多人使用 rsync 将文件移动到低优先级存储,在这种情况下,您希望移动到的文件仍然存在于目标目录中。这不是 delete 的作用:--delete确保当你从源目录中删除一个文件时,它也从你的目标目录中删除,所以你的目标不会充满垃圾......曾经看到一个人清除了他的备份通过放入一个新驱动器,而不是关闭他每晚的 rsync 脚本。脚本看到源目录现在是空的,它删除了目标目录中的每个文件,所以它们会匹配。

大多数其他选项都与空间或性能相关。如果您想在做任何事情之前确保传输成功,删除文件很重要,但是如果您的设备太小而无法处理所有信息的 2 个副本,则需要随时删除等。这是一个有点古怪,因为它在多个平台上有着悠久的历史:添加了一些选项,以便习惯了某些行为的人不会感到困惑。

  • 那么 --delete 和 --delete-before 是否相同?man rsync 没有说 --delete 何时删除文件。 (8认同)
  • 经过一些经验,我发现即使是“delete-during”也不总是能阻止“设备上没有剩余空间”(在 Linux 上)。因此,`delete-before` 是避免它的唯一保证方法(例如镜像几乎已满的驱动器,并且目标驱动器也几乎已满)。 (4认同)

Mec*_*cki 15

默认情况下rsync不会删除目标端的任何文件。要完全rsync删除文件,您至少需要使用其中一个删除选项。

如果您不关心文件何时被删除,只需使用--delete并将选择保留为rsync. 您可以--delete与其他删除选项结合使用(这不冲突),但您不必这样做,因为所有其他删除选项已经暗示了--delete

--delete-before工作原理如下:rsync查看源中存在哪些文件以及目标中存在哪些文件,删除在目标中找到但不在源中找到的所有文件,然后开始实际同步。如果目标存储空间很小,则此顺序很有用,因为它会在开始传输任何新文件之前首先在目标上释放更多磁盘空间。缺点是rsync需要更多内存来执行操作,整个操作是一个两步过程,因此速度较慢。

--delete-during工作原理如下:rsync立即开始同步文件,当遇到仅存在于目的地的文件时,将其删除。这样就没有速度损失,也不需要额外的内存。不利的一面是,可能会发生在删除删除的文件之前首先将大量新文件复制到目的地的情况,因此在操作期间目的地可能需要比整个操作结束后所需的更多磁盘存储空间完毕。

--delete-after工作原理如下:首先同步所有文件,然后执行与--delete-before同步阶段之前执行的相同操作。在最常见的情况下,这是最糟糕的选择,因为它需要最多的内存和目的地的最多磁盘空间,而且速度较慢,因为它是一个两步过程;基本上它结合了其他两种方法的所有缺点。此选项主要存在于您使用“合并文件”的情况(合并文件是什么以及它们的工作方式超出了本答案的范围)。由于这些文件可能包含删除时排除文件的规则,如果在删除阶段要考虑其内容,则必须在删除阶段之前复制新的合并文件。除非这是一个要求,否则--delete-after没有优势。

--delete-delay是一个相当新的选项(它在rsync2.6.9 中不可用,例如,它仍然是 macOS 10.15 中的默认值)。它的工作原理类似--delete-during,但它不会删除文件立即但同步后完成的,所以它是一个混合--delete-during--delete-after。其优点是,它比快--delete-after,仍然能正确支持合并文件,缺点是它需要同步就像在更多的内存和磁盘空间--delete-after

--delete-excluded告诉rsync不仅要删除源中丢失的文件,还要删除目标中从同步(--exclude--exclude-from)中排除的文件,无论这些文件是否实际存在于源中。

  • 这比当前接受的答案更清晰、更详细。谢谢你! (4认同)

小智 6

值得一提的另一点是,如果源目录以 结尾/*,则 rsync 将仅考虑这些文件,而不考虑目录本身(因此不存在要在目标上删除的文件)。

如果您在上面指定了删除选项,但 rsync 看起来没有删除,那么请检查以确保您在指的是目录本身时不会意外地进行全局搜索并提供文件列表。