Gzip arşivinin son verilerini nasıl edinebilirim?


10

Sondaki verileri içeren bir gzip arşivim var. Bunu kullanarak paketini gzip -daçarsam bana şunu söyler: " dekompresyon tamam, sondaki çöp yoksayıldı " (aynı şey gzip -tböyle bir veri olduğunu tespit etme yöntemi olarak kullanılabilir).

Şimdi bu çöpü tanımak istiyorum, ama garip bir şekilde onu çıkarmak için herhangi bir yol bulamadım. gzip -l --verbosearşivin "sıkıştırılmış" boyutunun dosyanın boyutu (yani sondaki verilerle) olduğunu söyler, bu yanlış ve yararlı değildir. fileyardım da yok, ne yapabilirim?

Yanıtlar:


10

Şimdi takip verilerinin nasıl alınacağını anladım.

Sondaki verilerle bir dosya oluşturan Perl betiği oluşturdum, ağırlıklı olarak 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 ancak IMO, orijinalde olduğu gibi (ancak yeni satır eklemeden) stdout'a yazdırmak, sabit kodlu bir dosya adına yazmaktan daha iyidir. Bir dosyaya yönlendirebilir veya boruya lessya hdda hd | lessveya herhangi bir şeye yönlendirebilirsiniz.
cas

@cas: Giriş için teşekkürler. Şimdi biraz parametre işleme eklendi. İlk perl senaryom BTW, zamanın bir gün geleceğini biliyordum.
phk

1
güzel gelişme. eğer ben tekrar vekil o :) bir fikir daha - böyle bir program gerçekten bir giriş dosyası gerekmez, aynı zamanda stdin işleme çalışır. ve bir while (<>)döngü perlstdin ve @ARGV .... 'de listelenen tüm dosyaları okuyacaktır, bu da bir filtre (yani stdin'i okuyun, stdout'a yazın) ve adlandırılmış dosya (lar) ile eşit derecede iyi çalışan komut dosyaları yazmayı kolaylaştırır ). ve stdout, elbette, her zaman bir dosyaya yönlendirilebilir. Perl betiklerimin çoğu bundan yararlanmak için filtre olarak yazılmıştır.
cas

1
push @ARGV,'-' if (!@ARGV);önce my $input_file_name = shift;buraya gerekli her şey demek değildir. yani varsayılan arg -($ ARGV [0] == '-h' veya '--help' ise yardım mesajı yazdırılabilir.). Bir while(<>)döngü için bunu yapmanız bile gerekmez, ama muhtemelen böyle yazmaya değer IO::Uncompress::Gunzip.
cas

2
bu iyi. ve push yerine unshift, onu nasıl kullanmak istediğiniz için anlamlıdır, yine de çıktı dosya adının tek argüman olarak belirtilmesine izin verir. Ben şahsen dosya yönlendirmesi veya bir -oseçenek ya da bir şey - bazı açık sipariş olmadan üzerine yazılmasını sahip . bir betiğin otomatik olarak iki girdi ilk argümanından ilk argümana geçmesi ve sadece arg çıktısı bana riskli ve kazaya yatkın görünüyor (cazibeli murphy).
cas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.