问题定义:我将 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
结论
我也犯过同样的错误,而且我仍然找不到解决方案,有一些方法也许可以解决问题,但我建议在互联网上寻找更好的信息。
希望这有帮助!我不保证这会起作用,只是告诉你一些建议。