Wie erhalte ich nachfolgende Daten des gzip-Archivs?

10

Ich habe ein gzip-Archiv mit nachgestellten Daten. Wenn ich es damit entpacke, heißt gzip -des: " Dekomprimierung OK, nachlaufender Müll ignoriert " (dasselbe gilt für gzip -tdie Methode zum Erkennen solcher Daten).

Jetzt würde ich diesen Müll gerne kennenlernen, aber seltsamerweise konnte ich keinen Weg finden, ihn zu extrahieren. gzip -l --verbosesagt mir, dass die "komprimierte" Größe des Archivs die Größe der Datei ist (dh mit den nachfolgenden Daten), das ist falsch und nicht hilfreich. fileist auch keine Hilfe, also was kann ich tun?

phk
quelle

Antworten:

10

Jetzt herausgefunden, wie man die nachfolgenden Daten erhält.

Ich habe ein Perl-Skript erstellt, das eine Datei mit den nachfolgenden Daten erstellt. Es basiert stark auf 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
quelle
2
+1 aber IMO, das Drucken auf Standard wie im Original (jedoch ohne Anhängen einer neuen Zeile) ist besser als das Schreiben in einen fest codierten Dateinamen. Sie können zu einer Datei umleiten oder zu lessoder hdoder hd | lessoder was auch immer weiterleiten.
Cas
@cas: Danke für die Eingabe. Es wurde jetzt ein bisschen Parameterbehandlung hinzugefügt. Mein erstes Perl-Skript Übrigens, ich wusste, dass die Zeit eines Tages kommen würde.
Phk
1
schöne Verbesserung. Ich würde es wieder verbessern, wenn ich könnte :) Noch eine Idee - ein Programm wie dieses benötigt keine Eingabedatei, es funktioniert genauso gut, wenn es stdin verarbeitet. und eine while (<>)Schleife in perlliest stdin und alle in @ARGV aufgelisteten Dateien. Dies macht es einfach, Skripte zu schreiben, die genauso gut funktionieren wie ein Filter (dh stdin lesen, in stdout schreiben) und mit benannten Dateien ). und stdout kann natürlich immer in eine Datei umgeleitet werden. Die meisten meiner Perl-Skripte sind als Filter geschrieben, um dies auszunutzen.
Cas
1
push @ARGV,'-' if (!@ARGV);vorher my $input_file_name = shift;ist alles was hier gebraucht wird. dh ein Standardargument von -(die Hilfemeldung könnte gedruckt werden, wenn $ ARGV [0] == '-h' oder '--help'.). Für eine while(<>)Schleife müssten Sie das nicht einmal tun, aber es ist wahrscheinlich schwieriger, als es sich lohnt, es so zu schreiben IO::Uncompress::Gunzip.
Cas
2
Das ist gut. und das Verschieben anstelle von Push macht Sinn, wie Sie es verwenden möchten, ermöglicht jedoch weiterhin die Angabe eines Ausgabedateinamens als einziges Argument. Ich persönlich bin abgeneigt, Dateien ohne ausdrückliche Anweisung des Benutzers überschreiben zu lassen - Umleitung oder eine -oOption oder so. Wenn ein Skript automatisch vom ersten Argument von zwei Eingaben zum ersten wechselt und nur das Argument ausgegeben wird, erscheint es mir riskant und unfallanfällig (verlockende Murphy).
Cas