Gzip आर्काइव का ट्रेसिंग डेटा कैसे प्राप्त करें?


10

मैं अनुगामी डेटा के साथ एक gzip संग्रह है। अगर मैं इसे अनपैक कर देता हूं तो gzip -dयह मुझे बताता है: " डीकंप्रेसन ओके, ट्रेसिंग कचरा इग्नोर " (वही जाता है gzip -tजिसके लिए यह पता लगाने की विधि के रूप में इस्तेमाल किया जा सकता है कि ऐसा कोई डेटा है)।

अब मैं इस कचरे को जानना चाहूंगा, लेकिन अजीब तरह से मुझे इसे निकालने का कोई तरीका नहीं मिल रहा है। gzip -l --verboseमुझे बताता है कि संग्रह का "संपीड़ित" आकार फ़ाइल का आकार है (यानी अनुगामी डेटा के साथ), यह गलत है और सहायक नहीं है। fileभी कोई मदद नहीं है, तो मैं क्या कर सकता हूँ?

जवाबों:


10

अब पता लगाया गया है कि अनुगामी डेटा कैसे प्राप्त करें।

मैंने पर्ल स्क्रिप्ट बनाई जो अनुगामी डेटा के साथ एक फ़ाइल बनाती है, यह भारी रूप से 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 लेकिन IMO, मूल के रूप में (लेकिन एक नई पंक्ति को लागू किए बिना) प्रिंटआउट हार्ड-कोडित फ़ाइल नाम पर लिखने से बेहतर है। आप के लिए एक फ़ाइल, या पाइप रीडायरेक्ट कर सकते हैं lessया hdया hd | lessया जो कुछ भी।
कैस

@cas: इनपुट के लिए धन्यवाद। अब थोड़ा सा पैरामीटर हैंडलिंग जोड़ा गया। मेरी पहली पर्ल स्क्रिप्ट BTW, मुझे पता था कि समय एक दिन आएगा।
phk

1
अच्छा सुधार। मैं इसे फिर से बढ़ाऊंगा अगर मैं कर सकता था :) एक और विचार - इस तरह के एक प्रोग्राम को वास्तव में एक इनपुट फ़ाइल की आवश्यकता नहीं है, यह बस स्टेंडिंग प्रसंस्करण के रूप में अच्छी तरह से काम करता है। और @ARGV में सूचीबद्ध स्टड और किसी भी फ़ाइल (ओं) को पढ़ने वाला एक while (<>)लूप perl.... जो स्क्रिप्ट लिखना आसान बनाता है जो फ़िल्टर के समान काम करता है (यानी स्टड पढ़ें, stdout को लिखें) और नामित फ़ाइल के साथ। )। और stdout, ज़ाहिर है, हमेशा एक फ़ाइल पर पुनर्निर्देशित किया जा सकता है। इसका लाभ उठाने के लिए मेरी अधिकांश लिपियों को फिल्टर के रूप में लिखा गया है।
कैस

1
push @ARGV,'-' if (!@ARGV);इससे पहले my $input_file_name = shift;कि यहाँ सभी की जरूरत है। अर्थात, -$ ARGV [0] == '-h' या '--help') पर एक डिफ़ॉल्ट arg (सहायता संदेश मुद्रित किया जा सकता है।)। एक while(<>)लूप के लिए आपको ऐसा करने की आवश्यकता नहीं होगी, लेकिन यह शायद इसके लिए इसे लिखने की तुलना में अधिक परेशानी की बात है IO::Uncompress::Gunzip
कैस

2
यह ठीक है। और पुश के बजाय अनशिफ्ट समझ में आता है कि आप इसे कैसे उपयोग करना चाहते हैं, फिर भी आउटपुट फ़ाइलनाम को केवल arg के रूप में निर्दिष्ट करने की अनुमति देता है। मैं व्यक्तिगत रूप से फ़ाइलों को उपयोगकर्ता के कुछ स्पष्ट आदेश के बिना अधिलेखित होने से उलट रहा हूं - पुनर्निर्देशन या एक -oविकल्प या कुछ। एक स्क्रिप्ट होने के नाते स्वचालित रूप से दो के पहले arg से स्विच करने के लिए इनपुट जा रहा है और केवल arg उत्पादन किया जा रहा है जोखिम भरा और दुर्घटना-प्रवण मुझे (आकर्षक मर्फी)।
कैस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.