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

zwo*_*wol 6 large-files binary files

我有来自故障硬盘驱动器的两个部分磁盘映像。文件 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
Run Code Online (Sandbox Code Playgroud)

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

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

fro*_*utz 6

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

dd bs=512 if=A of=B conv=sparse,notrunc
Run Code Online (Sandbox Code Playgroud)

请事先使用您选择的一些测试文件进行验证。您不想无意中损坏您的 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
Run Code Online (Sandbox Code Playgroud)

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