问题定义:我把一个tar.gz文件从一台Linux机器转移到一个Windows分区。Windows分区以Linux服务器作为cifs挂载。
操作系统:红帽企业Linux服务器版本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 ),并且该过程也失败了。
这听起来像文件可能没有被正确地传输在二进制模式。 你可能能够使用unix2dos Backup-28--Jun--2011--Tuesday.tar.gz ,但是如果没有,你将不得不尝试再次传输,确保它使用二进制模式。
检查源文件和目标文件是一个好主意。
为了更清楚地了解损坏情况,可以使用cmp -l source.gz dest.gz进行逐字节的比较。 也有趣的是字节数是否不同( ls -l )。
这里有一个更小的分析工具来告诉你如何一个文件可能已经损坏。 合理大小的zip或gzip文件将具有几乎一致的字节分布。 下面是一个将直方图文件的perl脚本。 压缩和gzip文件已经被ASCII模式传输损坏将有不寻常的回车和换行频率,例如频率或计数两倍的标准,或零,或两者兼而有之。 (我已经看到不同的FTP服务器或客户端到不同的损坏,例如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;