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