Как получить конечные данные архива gzip?

10

У меня есть архив gzip с последними данными. Если я распаковываю его, используя gzip -dего, он говорит мне: « декомпрессия в порядке, конечный мусор игнорируется » (то же самое относится и к тому, gzip -tчто можно использовать в качестве метода обнаружения наличия таких данных).

Теперь я хотел бы узнать этот мусор, но, как ни странно, я не мог найти способ его извлечь. gzip -l --verboseговорит мне, что «сжатый» размер архива - это размер файла (т.е. с последними данными), это неправильно и бесполезно. fileтакже не помогает, так что я могу сделать?

PHK
источник

Ответы:

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";
}
PHK
источник
2
+1, но IMO, печать на стандартный вывод, как в оригинале (но без добавления новой строки), лучше, чем запись в жестко закодированное имя файла. Вы можете перенаправить в файл, или канал, lessили hdили hd | lessили что-то еще.
Cas
@cas: Спасибо за вклад. Добавлена ​​небольшая обработка параметров. Кстати, мой первый Perl-скрипт. Я знал, что время придет однажды.
phk
1
приятное улучшение. я бы повторил это снова, если бы мог :) Еще одна идея - такая программа на самом деле не нуждается во входном файле, она работает так же хорошо, как и обработка stdin. и while (<>)цикл in perlбудет читать stdin и любые файлы, перечисленные в @ARGV ...., что упрощает написание сценариев, которые одинаково хорошо работают как фильтр (то есть чтение stdin, запись в stdout) и с именованным файлом (ами). ). и stdout, конечно, всегда можно перенаправить в файл. большинство моих сценариев perl написаны как фильтры, чтобы воспользоваться этим.
Cas
1
push @ARGV,'-' if (!@ARGV);раньше my $input_file_name = shift;все, что нужно здесь. то есть аргумент по умолчанию -(справочное сообщение может быть напечатано, если $ ARGV [0] == '-h' или '--help'.). Для while(<>)цикла вам даже не нужно было бы делать это, но, вероятно, это больше проблем, чем стоит так писать IO::Uncompress::Gunzip.
Cas
2
все нормально. и unshift вместо push имеет смысл для того, как вы хотите его использовать, все еще позволяет указывать имя выходного файла в качестве единственного аргумента. Я лично не хочу, чтобы файлы перезаписывались без какого-либо явного указания со стороны пользователя - перенаправление, -oопция или что-то в этом роде. наличие сценария, автоматически переключающегося с первого аргумента из двух входных в первый и только выходного аргумента, кажется мне рискованным и случайным (заманчивое убийство).
Cas