我想比较两个存储在不同 Linux 机器上的大型二进制文件,它们之间的带宽有限,然后仅备份不同的块 – 在命令行上。为了简化任务,我们可以假设文件在比较过程中不会发生变化,并且文件大小相同。
这几乎就像我所认为的那样rsync
,只是我不想修改目标文件 - 我想保留可以应用于基础图像的差异,以便我可以在各个点重新创建副本(即当获取差异时)。
我也知道xdelta
,但它似乎只能比较同一台机器上的文件。
我粗略设想的“过程”(希望全部由脚本/程序完成)可能是 -
- (在每台机器上)为每个块生成一个哈希列表。
- 比较两组哈希值。
- 生成一个文件,该文件仅拉出源中已更改的块,以便它们可以与目标文件“合并”。
是否有人知道一个程序、脚本或优雅的方法可以做到这一点而无需我剪切代码?
答案1
我建议检查一下 rsync 的批处理模式。该--only-write-batch
选项似乎特别能实现您的目标。
答案2
高效的比较通常需要在同一台机器上比较文件,因为如果要考虑偏移量,则需要在此过程中进行大量范围检查。例如,如果我在文本文件中添加了一个字符,则在简单检查中,该字符之后的所有内容可能需要作为“新”传输。
Bit Torrent 实现了一个非常简单的检查方法。每个块都有一个校验和,每个文件由一系列块组成。块可能跨越两个或多个文件的末尾/开头,但块验证也会检查这些跨度。只有与文件描述不匹配的块才会被更改。因此,如果您启动一个客户端,其中一些文件写得准确,而另一些文件不同(由于损坏或更改),则只会传输修复差异所需的块。每个 torrent 描述文件的块大小可通过 2 的幂进行配置,并且有大量开源客户端可供您获取此代码。