我遇到了一个棘手的难题。我有一些文件位于两个不同的目标驱动器上,是从同一个源驱动器复制的。源驱动器出现故障,因此我使用 dd 将数据复制到一个目标驱动器(使用选项conv=noerror,sync
用零字节填充错误块),然后在同一源驱动器上使用 ddrescue 将数据复制到第二个分区,我听说 ddrescue 也会用零字节填充错误。
现在,我有两个目标驱动器,它们的数据几乎重复,只是这两个目标驱动器上的某些数据肯定不同。我只能推测这些差异是由那些零字节引起的,它们似乎位于这两个目标驱动器上数据的不同位置。我只能推测这些差异是由文件中在复制过程中遇到错误时用零填充的部分引起的。但是,两个独立的目标驱动器上用零填充的位置是不同的。大多数数据都是二进制文件。因此,源上的一些文件完全完整,而目标上的文件则不是,而其他文件在目标上完全完整,而源上的文件则不是。这些文件中的很多也是二进制文件。
理想情况下,我希望按如下方式同步两个驱动器:
- 逐位比较每个文件。
- 如果左侧文件的位为 1 且右侧文件的位为 0,则将 1 复制到右侧。
- 如果左侧文件的位为 0 且右侧文件的位为 1,则将 1 复制到左侧,或者至少保留右侧的 1(如果无法进行双向同步)。
此功能对我来说很有意义,但是是否有可以自动处理此问题的实用程序?我考虑过使用 rsync 来实现这一点,但似乎 rsync 仅根据大小和时间戳或校验和检查文件,而不是逐位检查,而且简单的校验和不会告诉您哪里应该有 1,但哪里却有 0。我还研究了 rdiff 和 bsdiff,它们都支持二进制文件,但它们似乎都只是输出一个 diff 文件,而不是进行任何实际的复制/同步。
那么,是否存在一个实用程序可以满足我的需求,如我上面描述的理想同步行为?操作系统不一定重要,因为我可以访问 OSX、Windows 和 Ubuntu。
答案1
这听起来就像你想要的是一个工具,它将检索两个文件的每个块,然后执行按位或在每个块上,并将输出发送到一个新文件。
伪代码可能如下所示。相同的位不会发生任何事情,而不同的位将被设置为 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
答案2
Rsync 应该允许您进行单向同步。我相信它也有一个检查选项,可以告诉您文件是否不同。