将大(稀疏)文件 A 的非零块合并到大文件 B 中

将大(稀疏)文件 A 的非零块合并到大文件 B 中

我有两个来自故障硬盘的部分磁盘映像。文件 B 包含磁盘的大部分内容,其中存在扇区读取失败的间隙。文件A是告诉的结果ddrescue重试所有失败的扇区,因此几乎完全是间隙,但包含一些重读成功的地方。我现在需要将文件 A 中有趣的内容合并回文件 B 中。算法很简单:

while not eof(A):
   read 512 bytes from A
   if any of them are nonzero:
       seek to corresponding offset in B
       write bytes into B

和我可以坐下来自己写这个,但我首先想知道是否有人已经编写并调试过它。

(让事情变得复杂的是,由于空间有限,文件 B 和文件 A 位于两台不同的计算机上 - 这就是为什么我不只是告诉ddrescue尝试填补 B 中的空白 - 但 A 可以是通过网络传输相对容易,稀疏。)

答案1

您的算法是在 GNU 中实现的dd

dd bs=512 if=A of=B conv=sparse,notrunc

请事先使用您选择的一些测试文件对此进行验证。您不想无意中损坏您的 File B。更好的算法是检查B该位置是否也有零,可惜这是不做dd的。

对于两台不同的计算机,您有多种选择。使用支持写入查找的网络文件系统(并非全部支持);提前传输文件;或通过 SSH 进行管道传输,如下所示:

dd if=A | ssh -C B-host dd of=B conv=sparse,notrunc
# or the other way around
ssh -C A-host dd if=A | dd of=B conv=sparse,notrunc

ssh -C选项启用压缩,否则您将通过网络传输千兆字节的零。

相关内容