জিজিপ সংরক্ষণাগারটির পেছনের ডেটা কীভাবে পাবেন?


10

আমার পেছনের ডেটা সহ একটি গিজিপ সংরক্ষণাগার রয়েছে। যদি আমি এটি ব্যবহার করে 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 তবে আইএমও, মূল হিসাবে স্টাডাউটে মুদ্রণ করা (তবে একটি নতুন লাইন সংযোজন না করে) হার্ড-কোডেড ফাইলের নাম লেখার চেয়ে ভাল। আপনি কোনও ফাইলে পুনর্নির্দেশ করতে পারেন, বা পাইপ lessবা hdবা hd | lessবা যাই হোক না কেন।
ক্যাস

@ ক্যাস: ইনপুট দেওয়ার জন্য আপনাকে ধন্যবাদ। এখন প্যারামিটারের সামান্য হ্যান্ডলিং যুক্ত হয়েছে। আমার প্রথম পার্ল স্ক্রিপ্ট বিটিডাব্লু, আমি জানতাম সময়টি একদিন আসবে।
পিএইচকে

1
সুন্দর উন্নতি আমি যদি আবার এটি উত্সাহিত করতে পারি তবে :) আরও একটি ধারণা - এর মতো প্রোগ্রামে আসলে কোনও ইনপুট ফাইলের প্রয়োজন হয় না, এটি স্ট্যান্ডিন প্রসেসিংয়ের পাশাপাশি কাজ করে। এবং একটি while (<>)লুপ ইন perlস্ট্যান্ডিন এবং @আরজিভিতে তালিকাভুক্ত যে কোনও ফাইল (গুলি) পড়বে .... যা ফিল্টার হিসাবে সমানভাবে কাজ করে এমন স্ক্রিপ্টগুলি লিখতে সহজ করে তোলে (যেমন স্ট্যান্ডিন পড়ুন, স্টাডআউটে লিখুন) এবং নামযুক্ত ফাইল (গুলি) )। এবং stdout, অবশ্যই সবসময় একটি ফাইলে পুনঃনির্দেশ করা যেতে পারে। আমার বেশিরভাগ পার্ল স্ক্রিপ্টগুলি এর সুবিধা নিতে ফিল্টার হিসাবে লেখা।
ক্যাস

1
push @ARGV,'-' if (!@ARGV);আগে my $input_file_name = shift;এখানে যা দরকার তা হয়। যেমন একটি ডিফল্ট আর্গ -(message এআরজিভি [0] == '-হ' বা '--হেল্প'। যদি সহায়তা বার্তা মুদ্রণ করা যায়)। " একটি while(<>)লুপের জন্য আপনার এমনকি এটি করার প্রয়োজনও হবে না তবে এটি সম্ভবত এটির জন্য এটি লেখার চেয়ে বেশি ঝামেলা IO::Uncompress::Gunzip
ক্যাস

2
এটা ভাল. এবং পুশের পরিবর্তে আনশিফ্টটি আপনি কীভাবে এটি ব্যবহার করতে চান তা বোঝায়, এখনও একটি আউটপুট ফাইলের নামটিকে একমাত্র আরগ হিসাবে নির্দিষ্ট করার অনুমতি দেয়। ব্যবহারকারী থেকে কিছু স্পষ্ট অর্ডার ছাড়াই ফাইলগুলি ওভাররাইট করা থেকে আমি ব্যক্তিগতভাবে বিরত রয়েছি - পুনঃনির্দেশ বা কোনও -oবিকল্প বা অন্য কিছু। একটি স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে দু'জনের প্রথম আরগ থেকে প্রথম ইনপুট হওয়াতে স্যুইচ করা এবং কেবল আর্গ আউটপুট হওয়াই আমার কাছে ঝুঁকিপূর্ণ এবং দুর্ঘটনা-প্রবণ বলে মনে হয় (প্রলোভনযুক্ত মারফি)।
ক্যাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.