rsync 可以更新仅部分更改而不完全重传的大文件吗?

rsync 可以更新仅部分更改而不完全重传的大文件吗?

我正在对一个非常大的文件图像文件(只有几个像素的差异)进行微小的更改,这需要很长时间才能通过网络传输。

rsync 有没有办法识别文件中的差异并仅通过网络发送小的差异?

答案1

rsync增量传输算法默认执行此操作。引用rsync 联机帮助页

描述

Rsync 是一种快速且用途广泛的文件复制工具。它可以通过任何远程 shell 在本地复制到/从另一台主机复制,或者复制到/从远程 rsync 守护进程复制。它提供了大量的选项来控制其行为的各个方面,并允许非常灵活地指定要复制的文件集。它以其增量传输算法而闻名,该算法通过仅发送源文件与目标中现有文件之间的差异来减少通过网络发送的数据量。 Rsync 广泛用于备份和镜像,并作为日常使用的改进复制命令。

如果您想禁用它,则必须使用-W--whole-file选项。

-W, --整个文件

此选项禁用 rsync 的增量传输算法,这会导致所有传输的文件被完整发送。当源计算机和目标计算机之间的带宽高于磁盘带宽时(特别是当“磁盘”实际上是网络文件系统时),如果使用此选项,传输可能会更快。当源和目标都指定为本地路径时,这是默认设置,但前提是没有有效的批量写入选项。

如果您确实知道文件已更改了多少,您甚至可以通过调整增量块大小来优化增量传输行为:

-B,--块大小=块大小

这迫使 rsync 的增量传输算法中使用的块大小为固定值。通常根据要更新的每个文件的大小来选择。详细内容请参见技术报告。

如果您想了解有关算法本身的更多信息,可以在这里找到:Rsync算法

答案2

您正在寻找的是--partial--inplace选项。我昨天发现了这些,因为我需要通过网络更新 100 GB 到 300 GB 的单个文件。它与较新版本的 rsync 配合使用也效果最佳。 cygwin里的那个好像根本就不好用。但从任何半现代的 Linux 到 Linux,限制不是网络,而是每一端读取已传输文件的速度。

我具体用这个:

rsync -avPHx --inplace --partial src/foo remote_host:/target/path/

编辑 - 来源是https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/- 请注意--append,源文章中提到的,可能很危险,因为如果文件增长,并且中间发生变化,--append山将无法按预期工作。本质上仅用于--append诸如仅附加到的日志文件之类的事情。

答案3

关于 rsync 的操作方式,每个人都说得没错,但对图像进行微小更改可能导致文件发生微小更改的唯一格式是原始位图格式(.bmp、.pnm、某些类型的 .tif)。通常的 .png 或 JPEG,或者 Gimp 或 Photoshop .xcf 或 .psd 文件,这些文件已经被压缩,因此很可能一个小的图像更改将导致磁盘上几乎完全不同的文件。这就是为什么 rsync 的 delta 算法看起来相当无效的原因。

相关内容