
次のコマンドを使用してbzip2ファイル(〜55 GB)を解凍しようとすると、特定のファイルで解凍プロセスが中断され、
tar -jxvf file.tar.bz2
長い時間待ってから他のファイルを解凍せずに次のエラーメッセージが表示されます。 。
bzip2: Compressed file ends unexpectedly;
perhaps it is corrupted? *Possible* reason follows.
bzip2: Inappropriate ioctl for device
Input file = (stdin), output file = (stdout)
It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.
You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
最後に解凍して詰まったファイルが偶然tarファイルですね。 tarファイルに興味がない場合は、tarファイルをスキップして他のファイルを引き続き抽出できますか?
答え1
通常、圧縮されたストリームがある時点で破損している場合、その時点以降は何も抽出できません。
を使用することをお勧めしbzip2recover
ますが、残念ながら実際にはブロック長が少しずつ異なります。 「デフォルトは900k」は近似であり、各チャンクの長さはわずかに異なります(bzip2を使用して大きなファイルを圧縮し、bzip2を使用して復元し、いくつかのチャンクを抽出して直接確認します)。
どのブロックが損傷しているかを確認するには、を使用できますbzip2 -tvv
。
もし破損したブロックの圧縮されていない長さを見つけることができます(たとえば、周囲の生き残ったブロックを読み取り、それらの間で失われたバイト数を推定するなど)。破損したブロックを置き換えるために、その長さのゼロパディングブロックを作成しようとすることができます。次にbzip2を実行し、抽出のためにリンクされたストリームをtar stdinに供給します(使用bzip2 -dc rec*file.bz2 | tar -xapf -
)。次に、破損した領域にtar
メタデータがない場合は、ほぼすべてを抽出します(0ブロック全体を含む1つのファイルを除く)。
その長さが分からないなら、完全に運がないのです。一部のデータ(ビデオなど)では、ファイルの途中で数バイトを切り取り、tarを使用して復元できます。これは許可されません。