Bagaimana cara mendapatkan data trailing dari arsip gzip?


10

Saya memiliki arsip gzip dengan data tambahan. Jika saya membongkar menggunakan gzip -ditu memberitahu saya: " dekompresi OK, trailing sampah diabaikan " (berlaku juga gzip -tyang dapat digunakan sebagai metode mendeteksi bahwa ada data seperti itu).

Sekarang saya ingin mengenal sampah ini, tetapi anehnya saya tidak dapat menemukan cara untuk mengekstraknya. gzip -l --verbosememberi tahu saya bahwa ukuran "terkompresi" dari arsip adalah ukuran file (yaitu dengan data trailing), itu salah dan tidak membantu. filejuga tidak membantu, jadi apa yang bisa saya lakukan?

Jawaban:


10

Menemukan sekarang bagaimana cara mendapatkan data trailing.

Saya membuat skrip Perl yang membuat file dengan data trailing, sangat didasarkan pada 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 tetapi IMO, mencetak ke stdout seperti pada aslinya (tetapi tanpa menambahkan baris baru) lebih baik daripada menulis ke nama file yang dikodekan keras. Anda dapat mengalihkan ke file, atau pipa ke lessatau hdatau hd | lessatau apa pun.
cas

@cas: Terima kasih atas masukannya. Menambahkan sedikit penanganan parameter sekarang. Script perl pertama saya BTW, saya tahu saatnya akan tiba suatu hari.
phk

1
perbaikan yang bagus. Saya akan menambahkannya lagi jika saya bisa :) satu ide lagi - program seperti ini tidak benar-benar membutuhkan file input, ia bekerja sama baiknya dengan memproses stdin. dan sebuah while (<>)loop in perlakan membaca stdin dan file apa pun yang terdaftar di @ARGV .... yang membuatnya mudah untuk menulis skrip yang berfungsi sama baiknya dengan filter (yaitu membaca stdin, menulis ke stdout) dan dengan file bernama (s) ). dan stdout, tentu saja, selalu dapat diarahkan ke file. sebagian besar skrip perl saya ditulis sebagai filter untuk memanfaatkan ini.
cas

1
push @ARGV,'-' if (!@ARGV);sebelumnya my $input_file_name = shift;adalah semua yang dibutuhkan di sini. yaitu arg default -(pesan bantuan dapat dicetak jika $ ARGV [0] == '-h' atau '--help'.). Untuk satu while(<>)loop Anda bahkan tidak perlu melakukan itu, tetapi mungkin lebih banyak kesulitan daripada layak untuk menulis seperti itu untuk IO::Uncompress::Gunzip.
cas

2
tidak apa-apa. dan unshift bukan push masuk akal untuk bagaimana Anda ingin menggunakannya, masih memungkinkan nama file keluaran ditetapkan sebagai satu-satunya arg. Saya pribadi tidak suka file ditimpa tanpa perintah eksplisit dari pengguna - pengalihan atau -oopsi atau sesuatu. memiliki skrip otomatis beralih dari arg pertama dari dua input menjadi yang pertama dan hanya arg menjadi output tampaknya berisiko dan rawan kecelakaan bagi saya (murphy yang menggoda).
cas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.