通过rsync恢复单个文件的传输


52

在Ubuntu中,我想通过将大文件从硬盘复制到可移动驱动器rsync。由于某些其他原因,该操作无法一次完成。因此,我试图找出如何rsync从上次中断的地方继续复制文件的方法。

我曾尝试使用的选项--partial--inplace,但与一起--progress,我发现rsync--partial--inplace实际从启动开始,而不是从什么左最后一次。rsync尽早手动停止并检查接收到的文件的大小也证实了我的发现。

但有了--append,rsync将从上次剩下的开始。

我很困惑,我该上看到手册页 --partial--inplace--append似乎涉及到从所剩下最后一次恢复复制。有人能够解释差异吗?为什么不恢复工作--partial--inplace继续工作呢?是真的,要继续复制,rsync必须使用该--append选件吗?

另外,如果部分文件是由mv或保留的cp,而不是由rsync 保留的,是否可以rsync --append正确地继续复制文件?

Answers:


39

要恢复中断的副本,应使用rsync --append。在手册页中对的解释--append

这导致rsync通过将数据附加到文件的末尾来更新文件,这 假定接收方已经存在的数据与发送方的文件开头相同。 [...]暗示--inplace,[...]

选项--inplace品牌rsync(过)直接写在目标文件的内容; 没有 --inplacersync将:

  1. 用一个临时名称创建一个新文件,
  2. 将更新的内容复制到其中,
  3. 与目标文件交换,最后
  4. 删除目标文件的旧副本。

正常操作模式主要是防止与可能已打开目标文件的应用程序发生冲突,以及其他在手册rsync页中列出的不幸事件。

请注意,如果复制/更新操作在步骤1.-3中失败。以上, rsync将删除临时目标文件;该--partial 选项将禁用此行为,rsync并将部分传输的临时文件保留在目标文件系统上。因此,除非您rsync使用--partial或 调用第一个文件,否则继续执行单个文件复制操作将不会有多大好处--partial-dir(与效果相同--partial,此外还指示rsync 在特定目录中创建所有临时文件)。


谢谢!如果部分文件是由mv或cp而不是rsync留下的,rsync --append是否可以正确地恢复文件复制?
蒂姆(Tim)2010年

1
@Tim简而言之,--append可以使人rsync相信,如果两个相应文件的长度不同,则较短的文件与较长的文件的起始部分相同。因此,是的,如果您开始使用复制大文件cp并中断复制过程,rsync --append则将仅复制文件的其余部分。(注意:如果cp由于系统崩溃而中断,则文件内容和元数据不同步的可能性很小,即文件已损坏。在这种情况下,rsync再次运行而无需 --append解决此问题。)
Riccardo Murri

2
因此,如果我正确理解这一点,是否没有办法告诉rsync 验证部分文件并恢复向该部分传输的文件的传输
Winny 2014年

1
@Winny,非常迟到:对于本地副本,没有明智的方法来执行此操作。对于网络副本,当您指定--partial不带时,这是默认模式--append
roaima

1
@Winny --append--append-verify有一个危险的失败案例:接收方的文件大小相同或更大,但数据不同。我建议改用一种解决方案--no-whole-file
汤姆·黑尔

21

要知道,--append暗示--inplace,这本身就意味着--partial

  • 通过仅使用,--partial您应该导致rsync留下部分传输并在随后的尝试中恢复它们。

  • 通过使用,--append您应rsync同时保留部分文件并在下次恢复它们。传输后,rsync应仅验证传输数据的校验和。

  • --append-verify 在校验和验证中包括整个文件,包括在先前传输中传输的任何部分。

  • 如果校验和中有一个--append--append-verify一个失败,则验证应导致文件完全重新传输(使用--inplace

你应该能够恢复mvcp操作有rsync,但你可能要使用的--append-verify安心选择。

请注意,使用--append原因rsync复制接收方的大小小于发送方的大小(无论时间戳如何)或接收方不存在的文件。通过有关此选项的文档:

如果文件需要传输,并且接收方的大小等于或大于发送方的大小,则跳过该文件。

手册页中的更多信息


--append--append-verify有一个危险的失败案例:接收方的文件大小相同或更大,但数据不同。我建议改用一种解决方案--no-whole-file
汤姆·黑尔

@TomHale文档建议,为了跳过文件,文件的两端大小和修改时间必须完全相同。如果这是一个合理的考虑,--checksum则应使用。我找不到它的明确指定,但是从逻辑上讲,任何可恢复的选项都应暗示,--no-whole-file因为--whole-file它们不兼容。
TomG

--append-verify将跳过具有不同日期(可能是“意外”)的相同或更大尺寸的文件。不需要--checksum 所有文件,就像rsync将对整个文件进行校验和一样,只需要传输文件即可。
汤姆·黑尔

--checksum告诉发送rsync对文件进行校验和,以确保无论大小/时间如何,所有更改的文件都可以传输。因为您描述的内容与文档或我的(有限的)经验不符,您是否获得了意外行为的来源?--append-verify
TomG

--append-verify指的是--appendIf a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.即使由于需要传输文件--checksum,也可能会跳过该文件。
汤姆·黑尔

6

David Schwartz是正确的,--partial(或者更好的是-P)做了您想要的。我在一个37G的文件上对此进行了验证,该文件通过网络被阻止了约8g。rsync快速扫描了部分文件的第一部分(由于有了,显示了进展情况-P),然后将传输恢复到部分文件的末尾。


网络副本与本地副本的处理方式不同,这就是这里的问题。
roaima

@roaima您是否有相关资源,或有文档详细解释了不同之处?我在(巨大)手册页中找不到它。
乔纳斯·谢弗

@JonasWielicki的手册页在--whole-file选项说明中提到了它。
roaima

@roaima非常感谢!这也意味着正确的解决方法是--no-W(实际上有效!)
JonasSchäfer18年

@JonasWielicki效率极低,这就是默认情况下禁用它的原因。--no-W除非您完全了解本地文件的设置,否则您真的不想使用。参见unix.stackexchange.com/a/181018/100397
roaima '18

2

您做对了--partial就可以了。它似乎是从头开始的,因为它总是从它需要复制的文件数据块列表的开头开始。该--append选项很危险,如果数据由于某种原因不匹配,将导致文件损坏。


不比较本地副本,它们只是被覆盖(或--append从字节偏移量继续)。
roaima

1

默认情况下,如果从本地磁盘传输到本地磁盘,rsync则将启用--whole-file。这将从头开始重新启动中断的传输,而不是检查已存在的部件。

要禁用此功能,请使用:

--no-whole-file

将此与--inplace或结合使用--partial将允许以后恢复传输。

我用于rsync复制的别名是:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

警告:请谨慎使用,--append-verify因为它会跳过所有相同或更大的目标文件。


对于网络传输rsync,在传输之前比较源文件和相应的目标文件,以便仅发送已更改的部分(增量传输)。--no-whole-file告诉rsync对本地到本地复制执行相同的操作。该文档没有建议对恢复单个文件的部分传输有任何影响。 rsync根据设计将跳过具有完全相同的大小和时间戳的文件。既不应--append-verify也不--no-whole-file应该改变这种行为,而--checksum应该与两者合作以省心磁盘IO的代价
TomG

--append-verify将跳过具有不同日期(可能是“意外”)的相同或更大尺寸的文件。不需要--checksum 所有文件,就像rsync将对整个文件进行校验和一样,只需要传输文件即可。
汤姆·黑尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.