是否有差异/合并实用程序比较二进制文件和基于二进制数据的差异在任一方向逐位同步数据?

我有一个棘手的困境。 我有两个不同的目标驱动器上的一些文件,从相同的源驱动器复制。 源驱动器已经失败了,所以我用dd复制数据到一个目的地(选项conv=noerror,sync填充错误的块与零字节),我用ddrescue在同一个源驱动器复制数据第二个分区,我听说ddrescue也填充零字节的错误。

现在,我有两个目标驱动器接近重复的数据,除了这两个目标驱动器上的一些数据是完全不同的。 我只能假设这些差异是由这些零字节引起的,这些零字节似乎位于这两个目标驱动器上的数据之间的不同位置。 我只能假定这些差异是由于在复制过程中遇到错误而被填满的文件部分引起的。 但是,两个独立的目标驱动器上的零填充点是不同的。 大部分数据由二进制文件组成。 因此,源文件中的某些文件完全不受影响,而目的文件中的文件却不完整,而其他文件完全保留在目标文件中,而源文件中的对应文件则不完整。 很多这些文件也是二进制文件。

理想情况下,我想同步两个驱动器如下:

  • 比较每个文件,逐位。
  • 如果左侧文件的位是1,右侧文件的位是0,则将1复制到右侧。
  • 如果左边的文件位是0,右边的文件位是1,如果双向同步不是一个选项,那么将这个1复制到左边,或者至less保留1。

这个function对我来说是有意义的,但是有没有一个可以自动处理的实用工具? 我想为此使用rsync,但似乎rsync只检查基于大小和时间戳或校验和,而不是一点一点的文件和一个简单的校验和不会告诉你哪里有0时,应该是1秒。 我也研究了rdiff和bsdiff,它们都支持二进制文件,但是它们似乎只是输出一个diff文件,而不是做任何实际的复制/同步。

那么是否存在一个我正在寻找的实用工具,正如我在上面描述的理想同步行为中所描述的那样? 操作系统不一定很重要,因为我可以访问OSX,Windows和Ubuntu。

它几乎听起来像你想要的是一个工具,它将检索这两个文件的每个块,然后对每个块执行按位或 ,并将输出发送到一个新的文件。

伪代码可能如下所示。 没有什么会发生在相同的位,并且位不相同的位将被设置为1。

 while not end-of-files: read block file_a read block file_b merged_block = file_a bitwise_or file_b write merged_block to file_c 

Rsync应该让你做一个同步的方法。 我相信它也有一个检查选项,告诉你,如果文件不同。