如何比较基于散列的远程文件,并只传输不同的块

我想比较两个存放在不同Linux机器上的大的二进制文件,它们之间的带宽有限,然后只在命令行上备份不同的块。 为了简化任务,我们可以假定文件在比较过程中不会改变,并且文件大小相同。

这几乎就像我认为rsync所做的,只是我不想修改目标文件 – 我想保留差异,我可以适用于基本图像,所以我可以在不同的点重新创build一个副本(即当差异是拍摄)。

我也知道xdelta ,但似乎只在同一台机器上比较文件。

我大致设想的“过程”(希望全部由脚本/程序完成)可能是 –

  1. (在每台机器上)为每个块产生一个散列列表。
  2. 比较两组哈希。
  3. 生成一个文件,只能将源文件中已更改的块以可以与目标文件“合并”的方式进行抽取。

有没有人知道一个程序,脚本或优雅的方法来做到这一点,而不必削减代码?

我build议检查rsync的批处理模式。 特别是--only-write-batch选项似乎可以实现您的目标。

有效的比较通常需要比较同一台机器上的文件,因为如果要考虑偏移量,则需要在此过程中进行大量的范围检查。 例如,如果我在一个文本文件中添加了一个字符,那么在这个字符之后的所有内容都可能需要在一个简单的检查中作为“新”来传输。

Bit Torrent实现了一个非常简单的检查方法的例子。 每个块都有一个校验和,每个文件由一系列块组成。 块可能跨越两个或更多文件的结尾/开始,但块validation也将检查这些跨度。 只有与文件描述不匹配的块才会被更改。 因此,你开始准备写一些文件和一些不同的(由腐败或改变)的客户端,只有必要的块来解决差异将被转移。 块的大小是可以configuration的每个torrent描述文件的2次方,并且有大量的开源客户端可以从中获取这个代码。