2010-06-25 12:29:20 +0000 2010-06-25 12:29:20 +0000
126
126

rsync删除选项之间有什么不同?

我在 rsync man page 上看到有很多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

答案 (4)

125
125
125
2010-06-25 14:19:55 +0000
  • --del/--delete_during: 在复制文件时删除目标目录下的文件(与--delete-before相比,--delete-before更节省内存。)

  • --delete: 从目标目录下删除文件。

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

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

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

  • --delete-after:

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

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

  • --delete-after: 接收器在传输后删除,而不是在传输前…如果rsync的其他部分在其他地方移动了额外的文件,你会想要这个而不是--delete-excluded,因为--delete在传输过程中决定要删除什么,而--delete则在一切完成后检查目录中是否有应该删除的文件。

  • 0x6&: 从目标目录中删除那些被明确排除在源目录传输之外的文件.

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

特别是0x6&标志,我见过很多次被搞砸了。很多人使用rsync来移动文件到低优先级的存储空间,在这种情况下,你希望你要移动的文件仍然存在于目标目录中。这不是delete的作用:0x6&确保当你从源目录中删除一个文件时,它也会从你的目标目录中被删除,所以你的目标目录不会被垃圾填满…。曾经看到一个人因为装了一个新盘,没有关闭晚上的rsync脚本,把自己的备份抹掉了。脚本看到源盘现在是空的,就把目标盘的所有文件都删除了,所以它们是匹配的。

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

2
2
2
2013-01-17 18:50:20 +0000

还有一点值得一提的是,如果你的源目录以/*结尾,那么rsync将只考虑_这些文件,而不是目录本身(因此在目标上没有你想要删除的文件)。

如果你在上面指定了一个删除选项,但是rsync看起来并没有删除,那么检查一下,确保你没有意外地globing并提供一个文件列表,而你指的是目录本身。

2
2
2
2010-06-25 12:57:07 +0000

有两件事。

1.谁来删除 2. 当发生

无论是发送方还是接收方都可以被指示进行删除(我不知道为什么这很重要)。所以当一台电脑的rsync连接到另一边的rsync服务器时,这就决定了谁在有效地发出删除命令。

什么时候发生很简单……之前是指所有的文件都被删除,然后rsync把文件拷贝过来,期间是指当它查看文件列表时,当它看到这些文件时就会删除它们,之后是指它等到所有的文件都传输过来后,再删除远程的文件。只有当传输被中断时,这才是重要的。

0
0
0
2019-12-31 14:32:28 +0000

默认情况下,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),不管这些文件在源端是否真的会存在。