gunzip:无效的压缩数据 - 格式违反

gunzip:无效的压缩数据 - 格式违反

问题定义:我将 tar.gz 文件从 Linux 机器传输到 Windows 分区。Windows 分区已作为 cifs 与 Linux 服务器一起安装。

操作系统:Red Hat Enterprise Linux Server 版本 5

症状:

复制过程成功后,使用 gunzip -t 进行完整性检查,该过程出现以下错误:

gunzip -t Backup-28--Jun--2011--Tuesday.tar.gz

gunzip: Backup-28--Jun--2011--Tuesday.tar.gz: invalid compressed data--format violated

并进一步尝试解压(tar -xvzf),但同样失败。

答案1

听起来文件可能未以二进制模式正确传输。您可能能够使其与 配合使用unix2dos Backup-28--Jun--2011--Tuesday.tar.gz,但如果不行,则必须尝试再次传输,确保它使用二进制模式。

答案2

对源文件和目标文件进行校验是一个好主意。

为了更具体地了解损坏的情况,您可以进行逐字节比较cmp -l source.gz dest.gz;同样令人感兴趣的是字节数是否不同(ls -l)。

这里还有一个小分析工具,可以告诉您其中一个文件可能已损坏。一个相当大的 zip 或 gzip 文件将具有几乎均匀的字节分布。下面是一个 perl 脚本,它将对文件进行直方图分析。被 ASCII 模式传输损坏的 zip 和 gzip 文件将具有不寻常的回车符和换行符频率,例如频率或计数是正常的两倍,或为零,或两者兼而有之。(我见过不同的 FTP 服务器或客户端对不同的 mangle 进行不同的处理,例如在 CR 后添加 NL,或从 CRLF 中删除 CR,或将每个 NL 变成 CR,反之亦然。这些都会破坏字符频率,正如我所描述的那样。)

将其保存为hist.pl并运行它perl hist.pl *.gz;查看字节值分布的频率将告诉您传输是否执行了某些操作,例如删除每个 CR,或者向每个 LF 添加 CR 等。

#!/usr/bin/perl -w
use strict;

die "filename arguments expected\n" if ($#ARGV < 0);

foreach my $filename (@ARGV) {
    if (!open IN, "<$filename") {
    warn "can't open '$filename'\n";
    next;
    }
    print "$filename\n";
    binmode(IN);
    my @hist = ();
    my $total = 0;
    while (read IN, my $buf, 1024) {
    foreach my $octet (unpack "C*", $buf) {
        $hist[$octet]++;
        $total++;
    }
    }
    close(IN);

    for (my $i = 0;  $i < 256;  $i++) {
    my $count = $hist[$i] || 0;
    my $p = sprintf("%.5f", $count/$total);
    print "[$i] $count $p\n";
    }
    print "total $total\n\n";
}
exit 0;

答案3

方法 1

尝试:

sudo apt upgrade

如果没有可升级的软件包,那么抱歉。如果有,并且 gunzip 是其中之一,那么继续。我建议始终运行软件包升级,因为它可能会解决许多错误。

方法 2

看看你是否能在网上找到另一个程序。如果你有电缆,或者有 wifi 连接到运行 Red Hat Enterpise 的机器,那么你可以使用 lynx

sudo apt install lynx

结论

我也犯过同样的错误,而且我仍然找不到解决方案,有一些方法也许可以解决问题,但我建议在互联网上寻找更好的信息。

希望这有帮助!我不保证这会起作用,只是告诉你一些建议。

相关内容