ラージ(レア)ファイルAのゼロ以外のブロックをラージファイルBにマージする

ラージ(レア)ファイルAのゼロ以外のブロックをラージファイルBにマージする

故障したハードドライブの部分ディスクイメージが2つあります。ファイル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は、限られたスペースのために2台の異なるコンピュータにあります。これはddrescueBの空白を埋めようとするのではなく、Aは比較的簡単にネットワーク経由で転送できるということです。)

答え1

あなたのアルゴリズムはGNUとして実装されましたdd

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

選択したいくつかのテストファイルを使用して、事前に確認してください。誤ってファイルを破損したくありませんB。より良いアルゴリズムは、Bその場所にもゼロがあることを確認することですが、残念ながらこれはdd行われません。

2台の異なるコンピュータにはいくつかのオプションがあります。書き込みナビゲーションをサポートするネットワークファイルシステムを使用してください(すべてサポートされているわけではありません)。次のようにファイルを事前に転送するか、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オプションを使用すると圧縮が可能です。それ以外の場合は、ネットワークを介してギガバイト単位のゼロを送信します。

関連情報