gzipアーカイブの末尾データを取得する方法は?


10

末尾のデータを含むgzipアーカイブがあります。それを使用して解凍するとgzip -d解凍OK、後続のガベージは無視されましたgzip -tと表示されます(このようなデータがあることを検出する方法として使用することもできます)。

今、私はこのゴミを知りたいのですが、不思議なことに、それを抽出する方法を見つけることができませんでした。gzip -l --verboseアーカイブの「圧縮された」サイズはファイルのサイズ(つまり、末尾のデータを含む)であることを教えてくれますが、これは誤りであり、役に立ちません。fileも役に立たないので、どうすればよいですか?

回答:


10

末尾のデータを取得する方法を考え出した。

末尾のデータを含むファイルを作成するPerlスクリプトを作成しました。これは、https//bugs.debian.org/cgi-bin/bugreport.cgi?bug = 604617#10に大きく基づいています

#!/usr/bin/perl
use strict;
use warnings; 

use IO::Uncompress::Gunzip qw(:all);
use IO::File;

unshift(@ARGV, '-') unless -t STDIN;

my $input_file_name = shift;
my $output_file_name = shift;

if (! defined $input_file_name) {
  die <<END;
Usage:

  $0 ( GZIP_FILE | - ) [OUTPUT_FILE]

  ... | $0 [OUTPUT_FILE]

Extracts the trailing data of a gzip archive.
Outputs to stdout if no OUTPUT_FILE is given.
- as input file file causes it to read from stdin.

Examples:

  $0 archive.tgz trailing.bin

  cat archive.tgz | $0

END
}

my $in = new IO::File "<$input_file_name" or die "Couldn't open gzip file.\n";
gunzip $in => "/dev/null",
  TrailingData => my $trailing;
undef $in;

if (! defined $output_file_name) {
  print $trailing;
} else {
  open(my $fh, ">", $output_file_name) or die "Couldn't open output file.\n";
  print $fh $trailing;
  close $fh;
  print "Output file written.\n";
}

2
+1がIMOで、元のように(ただし改行を追加せずに)stdoutに出力する方が、ハードコードされたファイル名に書き込むよりも優れています。あなたはにファイル、またはパイプにリダイレクトすることができるlessか、hdまたはhd | lessまたはものは何でも。
cas

@cas:入力ありがとうございます。パラメータ処理のビットを追加しました。ところで、私の最初のperlスクリプトは、いつか来る日が来ることを知っていました。
16

1
素晴らしい改善。できればもう一度投票します:)もう1つのアイデア-このようなプログラムは実際には入力ファイルを必要とせず、stdinの処理と同じように機能します。そして、while (<>)のループperl、それが簡単に書き込みスクリプトへの作業も同様にだけでなく、フィルタこと(つまり標準入力、標準出力への書き込みを読んで)と名付けられたファイル(複数可となります@ARGVに記載されている標準入力読み込み、任意のファイル(複数可)します.... )。もちろん、標準出力は常にファイルにリダイレクトできます。私のperlスクリプトのほとんどは、これを利用するためのフィルターとして作成されています。
cas

1
push @ARGV,'-' if (!@ARGV);前にmy $input_file_name = shift;ここで必要なのはそのすべてです。つまり、デフォルトの引数-($ ARGV [0] == '-h'または '--help'の場合、ヘルプメッセージが出力される可能性があります。)。以下のためにwhile(<>)ループあなたもそれを行う必要はありませんが、それはおそらくのためにそのようにそれを書くためにそれの価値よりも多くのトラブルですIO::Uncompress::Gunzip
cas

2
大丈夫だよ。そして、pushの代わりにunshiftを使用する方法は理にかなっていますが、出力ファイル名を唯一の引数として指定できます。私は個人的に、ユーザーからの明示的な命令なしにファイルが上書きされることを嫌っています-リダイレクトまたは-oオプションなど。スクリプトが入力の2つの最初の引数から最初の引数に自動的に切り替わり、出力のみが自動的に切り替わるのは危険で、私には偶然になりがちです(マーフィーの試み)。
cas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.