我在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


评论

为什么--delete-before被描述为(默认)?我无法理解(默认)的含义。

手册页中不再将rsync版本3.1.2协议版本31的默认值指定为默认值。但是,我对带有引号的文本版本的猜测是,如果仅使用--delete而不是--delete-WHEN,则它是就像您指定了--delete-WHEN一样,其中WHEN默认为before。

#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确保从源目录中删除文件时,该文件也从目标目录中删除,因此目标不会充满垃圾……一旦看到一个人将其擦掉通过放入新驱动器进行备份,而不必关闭每晚的rsync脚本。脚本看到源目录现在为空,并且删除了目标目录中的每个文件,因此它们匹配。

其他大多数选项与空间或性能有关。如果要在执行任何操作之前确保传输成功,则删除文件很重要,但是如果设备太小而无法处理所有信息的2个副本,则需要随手删除,依此类推。有点古怪,因为它在多个平台上都有悠久的历史:已添加一些选项,这样习惯于某些行为的人就不会感到困惑。

评论


那么--delete和--delete-before相同吗? man rsync没有说--delete何时删除文件。

–ppr
15年7月3日在15:07

@ppr:取决于系统。它具有许多特定选项的原因是因为Solaris上的delete!= HP-UX上的delete!= AIX上的delete!= Linux上的delete!=删除。

–撒旦小狗
2015年7月6日14:39

在同步整个目录时,在同步之间或仅在整个目录已镜像之后,delete-after会在同步之间删除每个文件吗?我认为delete-after可以满足我的需求,但是备份一个驱动器时设备上没有剩余空间。

– Sridhar Sarnobat
15年8月3日,21:56

@ Sridhar-Sarnobat:可以。它移动了将要移动的所有内容,完成后便开始删除内容。如果要在删除所有内容之前将其删除,请使用--delete-during

–撒旦小狗
15年8月4日在18:58

经过一些经验后,我发现即使在执行删除操作期间,也并不总是会阻止设备上没有剩余空间(在Linux上)。因此,before-before是避免这种情况的唯一保证方法(例如,当镜像几乎已满的驱动器,而目标驱动器也几乎已满时)。

– Sridhar Sarnobat
17年1月26日在22:58



#2 楼

默认情况下,rsync不会在目标端删除任何文件。要使rsync完全删除文件,您需要至少使用一个删除选项。
如果您不在乎何时删除文件,只需使用--delete并将选择保留为rsync即可。您可以将--delete与其他删除选项结合使用(这不会冲突),但是您不必这样做,因为所有其他删除选项都已经暗示了--delete
--delete-before的工作方式如下:rsync看起来源于哪些文件,并且目的地中存在哪些文件,删除在目的地但在源中找不到的所有文件,然后开始实际同步。如果目标的存储空间很小,则此顺序很有用,因为在开始传输任何新文件之前,它将首先释放目标上的更多磁盘空间。缺点是rsync将需要更多的内存来执行该操作,并且整个操作是一个两步过程,因此速度较慢。
--delete-during的工作方式如下:rsync立即开始同步文件,并且当它遇到一个存在的文件时仅在目的地,它被删除。这样就不会造成速度损失,也不需要额外的内存。不利的一面是,可能会在删除删除的文件之前先将许多新文件复制到目标位置,因此目标位置在操作过程中可能需要比最终在整个操作完成后需要更多的磁盘存储空间。完成。
--delete-after的工作方式如下:首先同步所有文件,然后执行--delete-before在同步阶段之前执行的相同操作。在大多数情况下,这是最糟糕的选择,因为它需要最多的内存,目标位置上的大多数磁盘空间,并且速度较慢,因为它需要两个步骤。基本上,它结合了其他两种方法的所有缺点。此选项主要用于您正在使用“合并文件”的情况(什么是合并文件以及它们如何工作超出了此答案的范围)。由于这些文件可能包含删除期间要排除的文件的规则,因此,如果在删除阶段要考虑其内容,则必须在删除阶段之前复制新的合并文件。除非有此要求,否则--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),无论这些文件是否实际存在于源文件中。

#3 楼

有两件事在发生:


谁执行删除操作
发生时


可以指示发送者或接收者进行删除删除(我不确定为什么这很重要)。因此,当一台计算机上的rsync连接到另一台计算机上的rsync服务器时,这将确定谁在有效地发出delete命令。

发生这种情况很容易...之前意味着将所有文件删除,然后rsync复制文件。在遍历文件列表期间,它将在涉及到文件时将其删除,而在遍历之后,它将等待直到所有文件都被转移,然后再删除远程端。仅在传输中断时才重要。

评论


我敢肯定,这些选项均与从发件人一方删除内容无关。所有这些(AFAIK)都与从接收方删除事物有关。另外,您说:“之前意味着所有文件都将被删除,然后rsync将在文件上进行复制” –是这样吗?我希望--delete-before仅删除那些需要删除的文件,而不是所有文件!但是我想rsync可能会删除所有内容,然后通过“新”(可能未更改)数据进行传输...

– Quuxplusone
16年5月15日在1:59

嗯,rsync支持“从发送方删除”,但该选项的名称是--remove-source-files。

– Quuxplusone
16年5月15日在2:02

#4 楼

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

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