我看到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
答案1
--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 份副本,则需要边删除边删除,等等。由于它在多个平台上的历史悠久,因此有点古怪:已添加一些选项,以便习惯某些行为的人不会感到困惑。
答案2
默认情况下rsync
不会删除目标端的任何文件。要rsync
删除文件,您需要至少使用一个删除选项。
如果您不关心文件何时被删除,只需使用--delete
并将选择权留给rsync
。您可以--delete
与其他删除选项结合使用(这不会冲突),但您不必这样做,因为所有其他删除选项已经暗示了--delete
。
--delete-before
工作原理如下:rsync
查看源上有哪些文件以及目标上有哪些文件,删除在目标上找到但在源上不存在的所有文件,然后开始实际同步。如果目标的存储空间很少,此顺序很有用,因为它将首先在目标上释放更多磁盘空间,然后再开始传输任何新文件。缺点是rsync
执行操作需要更多内存,并且整个操作分为两个步骤,因此速度较慢。
--delete-during
其工作原理如下:rsync
立即开始同步文件,当遇到仅存在于目标位置的文件时,将其删除。这样既不会影响速度,也不需要额外的内存。缺点是,在删除已删除的文件之前,可能会先将大量新文件复制到目标位置,因此目标位置在操作过程中可能需要的磁盘存储空间可能比整个操作完成后最终所需的磁盘存储空间大得多。
--delete-after
工作原理如下:首先同步所有文件,然后执行--delete-before
与同步阶段之前相同的操作。在大多数情况下,这是最糟糕的选择,因为它需要最多的内存、目的地的最多磁盘空间,而且由于它是一个两步过程,所以速度较慢;基本上它结合了其他两种方法的所有缺点。此选项主要适用于您使用“合并文件“(合并文件是什么以及它们如何工作超出了这个答案的范围)。由于这些文件可能包含删除期间要排除的文件的规则,因此如果在删除阶段要考虑其内容,则必须在删除阶段之前复制新的合并文件。除非这是一项要求,否则--delete-after
没有任何优势。
--delete-delay
是一个相当新的选项(它在 2.6.9 中不可用rsync
,例如在 macOS 10.15 中仍然是默认选项)。它的工作原理类似于,但它不会立即删除文件,而是在同步完成后删除,因此它是和--delete-during
的混合体。优点是它比 更快并且仍然支持正确合并文件,缺点是它在同步过程中需要更多的内存和磁盘空间,就像 一样。--delete-during
--delete-after
--delete-after
--delete-after
--delete-excluded
告诉rsync
不仅要删除源中丢失的文件,还要删除目标中排除在同步之外的文件(--exclude
或--exclude-from
),无论这些文件是否真正存在于源中。
我该用哪一个?
如果您使用合并文件,您可能希望使用--delete-delay
(如果可用),否则--delete-after
。
如果您不使用合并文件,您通常希望使用
--delete-during
最快的文件。
仅当目标位置的存储空间非常紧张并且要同步的数据刚好适合那里时,您才可能需要使用,--delete-before
因为在这种情况下--delete-during
可能会失败,因为目标位置可能会耗尽磁盘空间,但--delete-before
可能仍然会成功。
至于内存消耗,对于拥有大量可用内存的现代系统来说,这通常根本不是问题。对于微型嵌入式设备来说,这可能是一个问题,但这些设备通常rsync
首先不会用于文件同步,而且也几乎没有空闲磁盘空间。
答案3
另外值得一提的是,如果你的源目录以 结尾/*
,那么 rsync 将只考虑那些文件而不是目录本身(因此不存在您想要在目标上删除的文件)。
如果您在上面指定了删除选项,但是 rsync 看起来并没有删除,那么请检查以确保当您指的是目录本身时,您没有意外地提供文件列表。
答案4
有两件事正在发生:
- 谁删除了
- 当它发生时
可以指示发送者或接收者执行删除操作(我不确定这为什么重要)。因此,当一台计算机的 rsync 连接到另一侧的 rsync 服务器时,这将确定谁有效地发出了删除命令。
发生这种情况时非常简单...before 表示所有文件都被删除,然后 rsync 复制文件。during 表示在遍历文件列表时,它会在遇到文件时删除它们,after 表示它会等到所有文件都传输完毕后再删除远程端。这仅在传输中断时才重要。