如何从 bzip2 压缩中提取所有未损坏的文件?

如何从 bzip2 压缩中提取所有未损坏的文件?

我正在尝试使用以下命令解压缩 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元数据,您将几乎提取所有内容(除了一个文件将包含一整块零)。

如果你无法算出那个长度,那你就完全不走运了。对于某些数据(例如视频),从文件中间剪切一些字节然后期望它会恢复是可以接受的;对于 tar 来说这是不可接受的。

相关内容