默认情况下,rsync
不会在目标端删除任何文件。要让rsync
完全删除文件,你需要使用至少一个删除选项。
如果你不关心文件何时被删除,只需使用--delete
,并将选择权留给rsync
。你可以将--delete
与其他删除选项结合起来(这并不冲突),但你不必这样做,因为所有其他的删除选项已经意味着--delete
。
--delete-before
的工作原理如下。rsync
查看哪些文件存在于源文件,哪些文件存在于目标文件,删除所有存在于目标文件但不存在于源文件的文件,然后开始实际同步。如果目的地的存储空间很小,这个顺序很有用,因为它将首先在目的地释放更多的磁盘空间,然后再开始传输任何新文件。缺点是rsync
将需要更多的内存来执行操作,而且整个操作是一个两步过程,因此速度较慢。
--delete-during
的工作原理如下。rsync
会立即开始同步文件,当遇到一个只存在于目的地的文件时,就会将其删除。这样就不会有速度上的惩罚,也不需要额外的内存。缺点是可能会出现先将大量新文件复制到目的地,然后再删除被删除的文件,所以在操作过程中,目的地需要的磁盘存储空间可能比最后整个操作完成后需要的磁盘存储空间大得多。
--delete-after
的工作原理如下。首先同步所有文件,然后在同步阶段前执行与--delete-before
相同的操作。在大多数常见的情况下,这是最差的选择,因为它需要最多的内存、最多的目标磁盘空间,而且它是一个两步的过程,所以速度较慢;基本上它综合了其他两种方法的所有缺点。这个选项主要存在于你使用"merge files“的情况下(什么是merge files,如何工作不在本回答的范围内)。由于这些文件可能包含在删除过程中要排除的文件规则,如果新的合并文件的内容要在删除阶段被考虑,那么必须在删除阶段之前复制。除非这是一个要求,否则--delete-after
没有优势。
--delete-delay
是一个比较新的选项(在rsync
2.6.9中是没有的,比如在macOS 10.15中还是默认的)。它的工作原理和--delete-during
一样,只不过它不会立即删除文件,而是在同步完成后再删除,所以它是--delete-during
和--delete-after
的混合体。它的优点是比--delete-after
快,缺点是同步过程中需要更多的内存。
--delete-excluded
告诉rsync
不仅要删除源端缺失的文件,还要删除目标端被排除在同步之外的文件(--exclude
或--exclude-from
),不管这些文件在源端是否真的会存在。