কীভাবে ইউনিক্সে জেলিব ডেটা সঙ্কুচিত করবেন?


106

আমি পাইথনে zlib- সংকুচিত ডেটা তৈরি করেছি:

import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
    f.write(z)

(বা শেলের এক-লাইনার echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data:)

এখন, আমি শেলের মধ্যে ডেটা সঙ্কুচিত করতে চাই। আমরাও zcatনা uncompressকাজ:

$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format

$ zcat /tmp/data 
gzip: /tmp/data.gz: not in gzip format

$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format

দেখে মনে হচ্ছে আমি জিপ-মতো ফাইল তৈরি করেছি, তবে কোনও শিরোনাম ছাড়াই। দুর্ভাগ্যক্রমে আমি gzip ম্যান পেজে এই জাতীয় কাঁচা তথ্য সঙ্কুচিত করার কোনও বিকল্প দেখতে পাচ্ছি না, এবং zlib প্যাকেজে কোনও এক্সিকিউটেবল ইউটিলিটি নেই।

কাঁচা zlib ডেটা সঙ্কুচিত করার জন্য কি কোনও ইউটিলিটি আছে?


এখানে অনেকগুলি অতিরিক্ত উত্তর রয়েছে: stackoverflow.com/questions/3178566/deflate-command-line-tool
জ্যাক ও'কনর

উত্তর:


140

স্ট্যান্ডার্ড + ব্যবহার করে এটি ডিকম্প্রেস করাও সম্ভব , যদি আপনার কাছে না থাকে বা আপনি বা অন্যান্য সরঞ্জাম ব্যবহার করতে চান ।
কৌশলটি হ'ল gzip ম্যাজিক নম্বরটি প্রিপেন্ড করা এবং এর থেকে প্রকৃত ডেটাতে পদ্ধতিটি সংকোচন করা zlib.compress:

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out

সম্পাদনা:
@ d0sboots মন্তব্য করেছে: RA Deflet ডেটার জন্য আপনার আরও 2 টি নাল বাইট যুক্ত করতে হবে:
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

এসও-তে এই প্রশ্নটি এই পদ্ধতির সম্পর্কে আরও তথ্য দেয়। সেখানে একটি উত্তর প্রস্তাব দেয় যে এখানে একটি 8 বাইট ফুটারও রয়েছে।

ব্যবহারকারী @ ভিটালি-কুশনার এবং @ চিহ্ন-বেসসি এমনকি সংক্ষিপ্ত ফাইলগুলি দিয়ে সাফল্যের কথা জানিয়েছেন, তাই কোনও জিজিপ ফুটারের কঠোর প্রয়োজন মনে হয় না।

@ tobias-kienzler জন্য এই ফাংশনটির পরামর্শ দিয়েছেন :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)


gzip কাজ করে না, তবে zlib- ফ্ল্যাট করে (পিডিএফ পৃষ্ঠার সামগ্রী স্ট্রিম)।
ড্যানিয়েল এস ইয়াইটসকভ

69

ব্যবহারকারী @ টিনো ওপেনএসএসএল উত্তরের নীচে মন্তব্য করেছেন তবে আমি মনে করি এটি আলাদা হওয়া উচিত:

zlib-flate -uncompress < FILE

আমি এটি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করে।

zlib-flateপ্যাকেজের মধ্যে পাওয়া যাবে qpdf(অন্যান্য উত্তর হিসাবে মন্তব্য অনুযায়ী, দেবিয়ান স্কিজ এবং ফেডোরায় 23)


3
অন্যান্য উত্তরের বিপরীতে, এটি ওএস এক্সে কাজ করে
পোলিম

2
@ পলিম, আপনি কীভাবে ম্যাকস এ zlib-flate ইনস্টল হলেন ? আমি এটি কোথাও দেখতে পাচ্ছি না।
ওয়াইল্ডকার্ড

4
@ উইলকার্ড দেরিতে সাড়া পাওয়ার জন্য দুঃখিত। আমি মনে করি এটি qpdfপ্যাকেজটি নিয়ে এসেছিল যা আমি উপরের মন্তব্যেbrew উল্লিখিত হিসাবে ইনস্টল করেছি - বা এই উত্তরের শেষ বাক্যটি দেখুন :) :)। এছাড়াও, সত্যিই দুর্দান্ত, তাই আপনার যদি সময় থাকে তবে এটিও একবার দেখুন! qpdf
পোলিম

brew ইনস্টল qpdf, তারপরে উপরে তালিকাভুক্ত কমান্ড :-) আপনাকে ধন্যবাদ!
ফার্নান্দো গ্যাব্রিয়েলি

60

আমি একটি সমাধান পেয়েছি (সম্ভাব্যগুলির মধ্যে একটি), এটি ওপেনসেল ব্যবহার করছে :

$ openssl zlib -d < /tmp/data

অথবা

$ openssl zlib -d -in /tmp/data

* দ্রষ্টব্য: zlib কার্যকারিতা সাম্প্রতিক ওপেনএসএল সংস্করণগুলিতে স্পষ্টতই উপলভ্য>> 1.0.0 (ওপেনএসএসএলকে কনফিগার / জিলিব বা জ্লিব-ডায়নামিক বিকল্পের সাহায্যে বিল্ট করতে হবে, আধুনিকটি ডিফল্ট হবে)


25
ডেবিয়ান কুঈজ (যা দ্বারা OpenSSL 0.9.8 আছে) উপর আছে zlib-flateমধ্যে qpdfপ্যাকেজ। এটি ব্যবহার করা যেতে পারে zlib-flate -uncompress < FILE
টিনো

7
ওপেনএসএসএল এর সর্বশেষতম সংস্করণগুলি থেকে zlib সরিয়ে ফেলা হয়েছে তাই এই টিপটি টিটো
আলেকজান্ডার কুরিলিন

1
ধন্যবাদ। এই সমাধানটি "gzip" ("ওপেনসেল" হিসাবে "gzip" প্রিন্টিং বাতিল হওয়া "ফাইলের অপ্রত্যাশিত প্রান্ত" যখন ব্যবহার করতে পারে তার চেয়ে উত্তরের চেয়ে সংক্ষিপ্ত ইনপুট ফাইলগুলি সংক্ষেপণে আরও ভাল অভিজ্ঞতা সরবরাহ করে)।
ড্যানিয়েল কে।

2
@ টিনো এর পৃথক উত্তর হওয়া উচিত
ক্যাটসকুল

1
টিনো, এটি ফেডোরা ২৩-তে প্যাকেজ কিউপিডিএফ এর মাধ্যমেও পাওয়া যায়। আলেকজান্ডার কুড়িলিন, জিলিব এখনও ১.০.২ ডি-ফিপসে উপলব্ধ।
maxschlepzig

28

আমি zlib সংক্ষেপণ গ্রন্থাগারের সহ-লেখক, মার্ক অ্যাডলারের কাছ থেকে পিগজের প্রস্তাব দিই । সম্পাদন প্রাপ্তিসাধ্য পতাকা দেখতে।pigz

আপনি খেয়াল করবেন:

-z --zlib Compress to zlib (.zz) instead of gzip format.

আপনি -dপতাকা ব্যবহার করে সঙ্কুচিত করতে পারেন :

-d --decompress --uncompress Decompress the compressed input.

'পরীক্ষা' নামে একটি ফাইল ধরে নেওয়া:

  • pigz -z test - টেস্ট.জেজ নামের একটি জেলিব সংকুচিত ফাইল তৈরি করে
  • pigz -d -z test.zz - টেস্ট.জেজকে ডিকম্প্রেসড টেস্ট ফাইলে রূপান্তর করে

ওএসএক্স-এ আপনি কার্যকর করতে পারেন brew install pigz


7
গুড ফাইন্ড! দেখে মনে হচ্ছে এটি নিজেরাই zlib ফাইলগুলি সনাক্ত করতে পারে, তাই unpigz test.zzকাজ করবে।
স্টাফেন চেজেলাস

আমার ডেটা সংক্ষেপিত হয়নি।
সাইবারনার্ড

1
@cybernard সম্ভবত আপনার কাছে একটি zlib ফাইল নেই। চেক করুন:$>file hello.txt.zz hello.txt.zz: zlib compressed data
স্নোডনিপার

11

zlibgzip দ্বারা ব্যবহৃত সংক্ষেপণ প্রয়োগ করে তবে ফাইল ফর্ম্যাটটি নয়। পরিবর্তে, আপনার নিজেরাই ব্যবহার করা gzipমডিউলটি ব্যবহার করা উচিত zlib

import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
    f.write(s)

ঠিক আছে, তবে আমার পরিস্থিতি হ'ল আমার তৈরি ফাইলগুলি কয়েক / দশ সহস্র আছে, তাই .. :)

1
সুতরাং ... আপনার ফাইলগুলি অসম্পূর্ণ। যদি আপনার কাছে এখনও মূল ডেটা না থাকে তবে সম্ভবত আপনাকে এগুলি zlibসঙ্কুচিত করতে হবে এবং তাদের সাথে সংশোধন gzipকরতে হবে।
গ্রেগ হিউগিল

6
@ মাইখাল, আপনি কেন এগুলিকে সঙ্কুচিত করতে পারবেন তা পরীক্ষা করার আগে আপনি দশ / লক্ষ হাজার ফাইল তৈরি করেছিলেন?

3
হার্পিয়ন, আমি সেগুলি সঙ্কুচিত করতে পারি, আমি কেবল আশ্চর্য হয়েছি যে এর জন্য কম বা বেশি সাধারণ প্রস্রাবতা বা zgip সেটিংস ব্যবহার করা যেতে পারে, যদি আমি আবার

3

এটি এটি করতে পারে:

import glob
import zlib
import sys

for filename in sys.argv:
    with open(filename, 'rb') as compressed:
        with open(filename + '-decompressed', 'wb') as expanded:
            data = zlib.decompress(compressed.read())
            expanded.write(data)

তারপরে এটি চালান:

$ python expander.py data/*

ধন্যবাদ, আমি সম্পর্কে জানতে zlib.decompress। সম্ভবত আমি কিছু ওয়াক ফাংশন ব্যবহার করব। আমি নিশ্চিত না যে শেল

প্রসারিত দ্বারা তৈরি করা ফাইলটি শেল fileকমান্ডটি ব্যবহার করে এখনও আমার জন্য "zlib সংক্ষেপিত ডেটা" হিসাবে পরীক্ষা করে ? ওটা কেমন?
কে। মাইকেল আয়ে

নকল এমনকি জাল শিরোনাম দিয়ে আমার জন্য কাজ করে না।
সাইবারনার্ড

3

zpipe.c এখানে মার্ক অ্যাডলার নিজেই উদাহরণস্বরূপ যে প্রোগ্রামটি পেয়েছেন তা (জেলিব লাইব্রেরির উত্স বিতরণের সাথে আসে) কাঁচা জেলিব ডেটা সহ এই পরিস্থিতিতে খুব দরকারী। সঙ্গে কম্পাইল cc -o zpipe zpipe.c -lzএবং ডিকম্প্রেস করতে: zpipe -d < raw.zlib > decompressed। এটি -dপতাকা ছাড়াই সংকোচনও করতে পারে ।


2

ম্যাকোস-এ, যা একটি সম্পূর্ণ পসিক্স অনুগামী ইউএনআইএক্স (আনুষ্ঠানিকভাবে প্রত্যয়িত!), OpenSSLএর কোনও zlibসমর্থন নেই, কোনও সমাধান নেই zlib-flateএবং প্রথম সমাধানটি যেমন পাইথন সলিউশন হিসাবে কাজ করে, প্রথম সমাধানটিতে ফাইলের মধ্যে জিপ ডেটা থাকা দরকার এবং অন্যান্য সমস্ত সমাধান আপনাকে পাইথন স্ক্রিপ্ট তৈরি করতে বাধ্য করে।

এখানে একটি পার্ল ভিত্তিক সমাধান রয়েছে যা কমান্ড লাইন ওয়ান-লাইনার হিসাবে ব্যবহার করা যেতে পারে, এসটিডিএন পাইপের মাধ্যমে এর ইনপুট পায় এবং এটি একটি নতুন ইনস্টলড ম্যাকোস দিয়ে বাক্সের বাইরে কাজ করে:

cat file.compressed | perl -e 'use Compress::Raw::Zlib;my $d=new Compress::Raw::Zlib::Inflate();my $o;undef $/;$d->inflate(<>,$o);print $o;'

আরও ভাল ফর্ম্যাটেড, পার্ল স্ক্রিপ্টটি দেখতে এমন দেখাচ্ছে:

use Compress::Raw::Zlib;
my $decompressor = new Compress::Raw::Zlib::Inflate();
my $output;
undef $/;
$decompressor->inflate(<>, $output);
print $output;

1

আপনি zlib দিয়ে সংকোচনের জন্য এটি ব্যবহার করতে পারেন:

openssl enc -z -none -e < /file/to/deflate

এবং এটি অপসারণ করা:

openssl enc -z -none -d < /file/to/deflate

4
দেয় unknown option '-z'উবুন্টু 16.04 এবং এরOpenSSL 1.0.2g 1 Mar 2016
টিনো

2
ম্যাক
-

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.