Come ottenere i dati finali dell'archivio gzip?


10

Ho un archivio gzip con dati finali. Se lo decomprimo usando gzip -dmi dice: " decompressione OK, trascinamento della spazzatura ignorato " (lo stesso vale per il gzip -tquale può essere usato come metodo per rilevare che ci sono tali dati).

Ora vorrei conoscere questa spazzatura, ma stranamente non sono riuscito a trovare alcun modo per estrarla. gzip -l --verbosemi dice che la dimensione "compressa" dell'archivio è la dimensione del file (cioè con i dati finali), che è sbagliato e non utile. filenon è di alcun aiuto, quindi cosa posso fare?

Risposte:


10

Capito ora come ottenere i dati finali.

Ho creato lo script Perl che crea un file con i dati finali, è fortemente basato su 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 ma IMO, stampare su stdout come nell'originale (ma senza aggiungere una nuova riga) è meglio che scrivere su un nome di file hardcoded. Puoi reindirizzare a un file, oppure reindirizzare lessao hdo hd | lesso qualsiasi altra cosa.
Cas

@cas: grazie per l'input. Aggiunto un po 'di gestione dei parametri ora. Il mio primo script perl BTW, sapevo che un giorno sarebbe arrivato il momento.
phk,

1
bel miglioramento. lo voterei di nuovo se potessi :) un'altra idea - un programma come questo non ha davvero bisogno di un file di input, funziona altrettanto bene anche per l'elaborazione di stdin. e un while (<>)loop in perlleggerà stdin e tutti i file elencati in @ARGV .... ciò semplifica la scrittura di script che funzionano ugualmente bene come filtro (cioè leggi stdin, scrivi su stdout) e con i file con nome ). e stdout, ovviamente, può sempre essere reindirizzato a un file. la maggior parte dei miei script perl sono scritti come filtri per trarne vantaggio.
CAS

1
push @ARGV,'-' if (!@ARGV);prima my $input_file_name = shift;è tutto ciò che serve qui. ovvero un argomento predefinito di -(il messaggio di aiuto potrebbe essere stampato se $ ARGV [0] == '-h' o '--help'.). Per un while(<>)ciclo non avresti nemmeno bisogno di farlo, ma probabilmente è più un problema di quanto valga la pena scriverlo così IO::Uncompress::Gunzip.
Cas

2
va bene. e unshift invece di push ha senso per come si desidera utilizzarlo, consente comunque di specificare un nome file di output come unico argomento. Personalmente sono contrario al fatto che i file vengano sovrascritti senza un ordine esplicito da parte dell'utente: reindirizzamento o -oun'opzione o qualcosa del genere. avere una sceneggiatura commutare automagicamente dal primo argomento in cui due vengono immessi nel primo e solo l'argomento in uscita mi sembra rischioso e incline agli incidenti (allucinante murphy).
Cas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.