web-dev-qa-db-ja.com

gunzip:無効な圧縮データ-形式違反

問題の定義:LinuxマシンからWindowsパーティションにtar.gzファイルを転送しました。WindowsパーティションはLinuxサーバーでcifsとしてマウントされています。

OS:Red Hat Enterprise Linux Server release 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

さらにuntarしようとしました(tar -xvzf)そしてプロセスも失敗します。

4
Arunjith

ファイルがバイナリモードで正しく転送されなかった可能性があります。あなたはそれをunix2dos Backup-28--Jun--2011--Tuesday.tar.gz、ただしそうでない場合は、バイナリモードを使用していることを確認して、もう一度転送する必要があります。

3
dtbarne

方法1

試してください:

Sudo apt upgrade

アップグレード可能なパッケージがない場合は、ごめんなさい。存在し、gunzipがその1つである場合は、続行します。多くのエラーが解決される可能性があるため、常にパッケージのアップグレードを実行することをお勧めします。

方法2

オンラインで別のプログラムを見つけることができるかどうか確認してください。 Red Hat Enterpiseを実行しているマシンにケーブルまたは一部のwifiが接続されている場合は、lynxを使用できます。

Sudo apt install lynx

結論

同じエラーが発生しましたそれでも解決策が見つからない場合、問題を解決できる方法がいくつかありますが、インターネットで詳細を確認することをお勧めします。

これが役に立てば幸い!これが機能することを保証するのではなく、いくつかの提案をします。

0
Ivan

ソースファイルと宛先ファイルのチェックサムをとることをお勧めします。

破損の内容をより具体的に把握するには、cmp -l source.gz dest.gzを使用してバイトごとの比較を行うことができます。また、バイト数が異なるかどうかも重要です(ls -l)。

次に、ファイルの1つが破損した可能性があることを示す、もう1つの小さな分析ツールを示します。適度に大きいサイズのZipまたはgzipファイルは、バイトの分布がほぼ均一になります。以下は、ファイルをヒストグラム化するPerlスクリプトです。 ASCII=モード転送によって破損したZipファイルとgzipファイルは、キャリッジリターンと改行の頻度が異常になります。たとえば、頻度またはカウントが標準の2倍、またはゼロ、あるいはその両方です。たとえば、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;
0
Liudvikas Bukys