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

Tim*_*Tim 60 linux rsync

在 Ubuntu 中,我想通过rsync. 由于某些其他原因,该操作无法在一次运行中完成。所以我想弄清楚如何使用rsync从上次停止的地方恢复复制文件。

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

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

正如我在手册页 --partial,上看到的那样,我很困惑--inplace--append似乎与从上次剩下的内容恢复复制有关。有人能够解释其中的区别吗?为什么不--partial--inplace为恢复复印而工作?对于恢复复制,rsync是否必须使用该--append选项?

此外,如果部分文件是由mvor留下的cp,而不是由 rsync留下的,是否会rsync --append正确恢复复制文件?

Ric*_*rri 46

要恢复中断的复制,您应该使用rsync --append. 从手册页的解释--append

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

选项--inplace使rsync(覆盖)直接写入目标文件内容;没有 --inplacersync会:

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

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

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

  • @Tim 简而言之,`--append` 使 `rsync` 相信,如果两个对应文件的长度不同,那么较短的文件与较长的文件的开头部分相同。所以,是的,如果你开始用 `cp` 复制一个大文件并中断复制过程,那么 `rsync --append` 将只复制文件的剩余部分。(_注意:_如果`cp`被系统崩溃中断,文件内容和元数据不同步的可能性很小,即文件损坏。在这种情况下,再次运行`rsync`_没有_` --append` 应该可以解决问题。) (2认同)
  • 所以如果我理解正确,没有办法告诉 rsync **验证部分文件并恢复传输到该部分传输的文件**? (2认同)

小智 27

请注意,这--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` 的解决方案](https://unix.stackexchange.com/a/545370/143394)。 (2认同)

小智 6

大卫施瓦茨是正确的,--partial(或更好,-P)做你想做的。我在一个 37G 文件上验证了这一点,该文件通过网络停止了 ~8g。rsync 快速扫描了部分文件的第一部分(由于 显示了进度-P),然后继续传输到部分文件的末尾。


Tom*_*ale 6

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

要禁用此功能,请使用:

--no-whole-file
Run Code Online (Sandbox Code Playgroud)

将此与--inplace或结合起来--partial将允许稍后恢复传输。

我用于rsync复制的别名是:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'
Run Code Online (Sandbox Code Playgroud)

警告:请小心使用,--append-verify因为它会跳过任何相同大小或更大的目标文件。