恢复巨大且损坏的 Gzip 文件

恢复巨大且损坏的 Gzip 文件

我有一个 50.9 GB 的文件,它是我在 Ubuntu 12.04 上的主文件夹的备份。我在终端上使用 tar 将此文件从我的 sda (ext4) 驱动器压缩到 sdb (ext4)。我使用的命令是

tar cvfz /media/2ndHDD/home.tar /home/<my_username>

压缩后出现此错误:

tar: Exiting with failure status due to previous errors

我重复压缩了三次,但压缩完成后还是出现同样的错误。因为第三次尝试时我已经筋疲力尽了(尤其是花了我一整天的时间),所以我只是忽略了这个错误,希望它不会影响我解压文件。

之后,我在 sda 驱动器上安装了新的操作系统 Ubuntu 14.04。安装完成后,我尝试使用以下命令解压之前压缩的文件

tar xvf home.tar

但我收到了这个错误:

gzip: stdin: invalid compressed data--format violated
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

所以我尝试使用 gzip 压缩文件

gzip home.tar

然后等了将近 1 个小时才完成。之后,我又用 gzip 解压了一次。

tar -xvzf home.tar.gz

这个过程根本无法完成,15 分钟后就会停止,导致创建的“主”文件夹中没有我期望的文件。我一遍又一遍地重复这个过程,但并没有真正完成。

有什么方法可以恢复这个巨大的压缩文件吗?我已经尝试过gzrecoverhttp://fosshelp.blogspot.com/2013/04/howto-recover-corrupted-targz-file.html) 但总是失败。当我尝试将其转换为 gzip 时,是否也可能我已经丢失了文件?我真的很后悔为什么我没有直接复制未压缩的主文件夹。:(

更新:刚才,我尝试使用此命令将其转换回 tar

gzip -d home.tar.gz

并通过运行来解压缩

tar xvf home.tar

现在我收到此错误:

gzip: stdin: invalid compressed data--format violated
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

即使只列出 tar 文件中的文件也无法完成处理

tar -tvf home.tar

我仍然会得到上述相同的错误

更新(2015 年 1 月 11 日):我尝试运行strace gunzip home.tar.gz,大约 15-20 分钟后,我得到了这些:

read(3, "\231\300\2678\242p\206\371\341\322\352\312\374\271?\252.\1775sC\330|D$PF$\10r\362V"..., 32768) = 32768
write(4, "\256Y\341\224\362Nn\315\316\373>\31\202\275c\373\266\265\345\27 R\312\2\221b'6\263\321\10F"..., 32768) = 32768
read(3, "[\366\"\r\265\244\3s\201\223b\n\267\364\34\247Ej\210tF\22\255B\254\223\216E\26\242\321\210"..., 32768) = 32768
write(4, "\n1g\201\\m\231\364\352@\"%\207\"Q+\37a^!8\226\233\204\244\v\334&i\361\2a"..., 32768) = 32768
read(3, "\222\327\351\337(\376\376?\246AzC\371\231\200${V\361\310W9.\3571a\362\357\251\306o\234"..., 32768) = 32768
write(4, "\346\216sH\250\272\264T\335\356<?\377\266\272o{\32\21\264\367\34\377w\327\220\324\313\231\2775\337"..., 32768) = 32768
read(3, "\266\276\345\213\277}G\235\355\360\326\232\244\353Z\\\215\222g\354\202\356\351\303G~\210\363b\31\17P"..., 32768) = 32768
write(4, "\326!1\332\213\253\276\327\222<\345\25\210\366\266\337uSkj>\345$\257\225\2q\321^8Jk"..., 32768) = 32768
read(3, "~D\212\373\372\"\373\367m0\322%\365S\377\335\331\336\376RB\037727e'\371#S\224\223"..., 32768) = 26366
read(3, "", 6402)                       = 0
write(4, "\23\320\"\0059\24\20\"\5#M\210I\323\320\363T\220N\321\301\207\\\327(I\204\362\371\377\32!"..., 32768) = 32768
write(4, " \6\325\33\246\324\35\240h\225B\270\312\207\211\340)\314\27\17\"pv\2232?\"0Sez\247"..., 14402) = 14402
close(3)                                = 0
utimensat(4, NULL, {{1420884866, 686801693}, {1420818997, 36136000}}, 0) = 0
fchown32(4, 1000, 1000)                 = 0
fchmod(4, 0666)                         = 0
close(4)                                = 0
rt_sigprocmask(SIG_BLOCK, [HUP INT PIPE TERM XCPU XFSZ], [], 8) = 0
unlink("home.tar.gz")                   = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
_llseek(0, 0, 0xbf8c86a0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

有了上面的输出,我还能恢复它吗?我只是不知道从哪里开始:(

答案1

首先,使用以下命令创建一个 gzip 压缩的 tar 存档:

tar cvfz /media/2ndHDD/home.tar /home/<my_username>

您忽略了错误,没有向上滚动查看错误内容(这是一个很糟糕的主意)。然后,您尝试解压 tar 文件(即使没有 -z 选项,它也应该能够识别出这是一个经过 gzip 压缩的 tar 存档):

tar xvf home.tar

它不起作用,你压缩了已经压缩的(使用相同的压缩算法)档案。你能解释一下这里的思考过程吗?

gzip home.tar

然后,您尝试解压已再次 gzip 压缩的 tarball:

tar -xvzf home.tar.gz

让我问一下 - 你知道你想要实现什么吗,或者你只是尝试随机命令,“让我们看看会发生什么”而不注意它们实际做了什么?

我强烈建议在将来更好地规划备份并注意存在的错误,因为也许 tar 的开发人员认为它们足够重要(毕竟,它是一个备份 - 通常非常重要)应该在过程结束时重复它们......

这次,我会先尝试查看您的档案(或剩余部分)的实际格式。使用:

file <archive_file>

如果它确实是经过 gzip 压缩的 tar 存档,并且抛出了这些错误,恐怕你就倒霉了。

更新:我了解到您当前拥有的文件是一个 gzip 存档:

home.tar: gzip compressed data, from Unix, last modified: Fri Jan  9 22:07:25 2015.

根据压缩数据的类型,我猜你执行此操作的分区上应该有 4 倍的可用空间。如果 home.tar 不在其他地方,请将其移出 /home 目录。

运行以下命令作为解压它的最后手段:

gunzip -c home.tar > home1.tar
file home1.tar

第一个命令会尝试将 home.tar 文件解压为 home1.tar。另一个命令会告诉您 home1.tar 实际上是什么。它仍然可能是另一个 gzip 存档。

如果file说这是 gzip 压缩的数据,请运行:

gunzip -c home1.tar > home2.tar

一定要注意文件名。找出 home2.tar 现在是什么:

file home2.tar

同样,如果它是经过 gzip 压缩的数据,请像上面一样再次对其运行 gunzip,这次重定向到 home3.tar。file再次运行它。

如果它说:

homeX.tar: POSIX tar archive (GNU)

尝试使用以下命令列出其内容:

tar taf homeX.tar

如果有效,请尝试解压 tar 文件。

相关内容