পাইপ দিয়ে উড়তে থাকা ফাইলগুলি আনজিপিং করা হচ্ছে


39

আমি কী আনজিপ করতে পারি বা এর মতো কোনও প্রোগ্রাম স্ট্যান্ডার্ড আউটপুটটিতে কাজ করতে পারি? পরিস্থিতিটি হ'ল আমি একটি জিপ ফাইল ডাউনলোড করছি, যা উড়ে যাওয়ার সময় আনজিপ করা হবে বলে মনে করা হচ্ছে।

সম্পর্কিত সমস্যা: আমি কীভাবে কোনও ডাউনলোড করা ফাইলটিকে স্ট্যান্ডার্ড আউটপেশে বাশ করতে পারি?


এটি করণীয় হওয়া উচিত বলে মনে হয়েছিল, তবে মনে হচ্ছে জিপটি কেবলমাত্র একটি ফাইল থাকলে জিপটি বের করতে এবং ফাইলটিকে অন্য কমান্ডে পাইপ করা সম্ভব। আমি একটি বহু-ফাইল জিপ থেকে একটি নির্দিষ্ট ফাইলটি বের করতে চেয়েছিলাম। পাইপিংয়ের পরিবর্তে, আমি মূল প্রশ্নটির উত্তর না দেওয়ার সময় এবং অস্থায়ী ফাইলগুলি তৈরি হওয়ার ফলে একাধিক কমান্ড 'আনজিপ ফাইল.জিপ / পাথ / ফাইল এবং & ডস্টফ / পাথ / ফাইল && rm -rf / পাথ' সাইন করেছিলাম প্রয়োজন নেই।
স্টান কুর্দিজিল

পিগজ পরীক্ষা করে দেখুন। আমরা এটি একটি পাইপে ব্যবহার করি। andrew.tumblr.com/post/2316602611
dmourati

উত্তর:


22

একটি জিপ ফাইল প্রকৃতপক্ষে একটি ধারক বিন্যাসের মধ্যে রয়েছে, তবে ফাইলটি সহজে পর্যাপ্ত স্মৃতিতে ফিট করতে পারে তবে এটি কোনও পাইপ (স্টিডিন) থেকে পড়তে পারে না তার কোনও কারণ নেই। এখানে পাইথন স্ক্রিপ্ট যা একটি জিপ ফাইলকে স্ট্যান্ডার্ড ইনপুট হিসাবে গ্রহণ করে এবং বর্তমান ডিরেক্টরিতে বা নির্দিষ্ট করে নির্দিষ্ট ডিরেক্টরিতে সামগ্রীগুলি বের করে।

import zipfile
import sys
import StringIO
data = StringIO.StringIO(sys.stdin.read())
z = zipfile.ZipFile(data)
dest = sys.argv[1] if len(sys.argv) == 2 else '.'
z.extractall(dest)

এই স্ক্রিপ্টটি এক লাইনে মিনিফাইম করে এবং একটি নাম হিসাবে তৈরি করা যেতে পারে।

alias unzip-stdin="python -c \"import zipfile,sys,StringIO;zipfile.ZipFile(StringIO.StringIO(sys.stdin.read())).extractall(sys.argv[1] if len(sys.argv) == 2 else '.')\""

এখন উইজেটের আউটপুট সহজেই আনজিপ করুন।

wget http://your.domain.com/your/file.zip -O - | unzip-stdin target_dir

1
আপনি এবং অজগর শিলা !!!
ফরিদ নুরি নেশাত

3
দুর্দান্ত এক-লাইনার এবং +1 ফাইলটি মেমরির সাথে ফিট করতে হবে তা উল্লেখ করার জন্য। (দুর্ভাগ্যক্রমে ফাইল ফর্ম্যাট কাঠামোর কারণে পিকেজিপ ফাইল আনজিপ করার কোনও উপায় নেই)।
lxgr


1
যদি ফাইলটি মেমরির মধ্যে সহজেই ফিট করতে পারে তবে এটি কোনও স্ট্রিম হিসাবে পড়া যায় না কেন তার কোনও কারণ নেই really বিষয়বস্তুগুলি বের করার আগে আপনাকে পুরো জিপ সংরক্ষণাগারটি মেমরিতে বাফার করতে বাধ্য করার কারণটি বিশেষত কারণ এটি স্ট্রিম হিসাবে পড়া যায় না। অবশ্যই, এটি কোনও ফাইলে জিপ সংরক্ষণাগারটি লেখা এড়াতে দরকারী।
হাকান লিন্ডকভিস্ট

এই হয় না একটি স্ট্রিম, আপনি মেমরি পুরো ফাইল ব্যবহার করে পড়া হয় .read()পদ্ধতি
Romuald Brunet

17

এটি আপনার প্রত্যাশা মতো কাজ করার সম্ভাবনা নেই। জিপ কেবল একটি সংক্ষেপণ বিন্যাস নয়, একটি ধারক বিন্যাসও। এটি উভয়ই টার এবং gzip.bzip2 এর কাজগুলিকে এক করে দেয়। এই কথাটি বলার পরে, আপনার জিপটিতে যদি একটি একক ফাইল থাকে তবে আপনি স্ট্রাউডে ফাইলগুলি আনার জন্য আনজিপ-পি ব্যবহার করতে পারেন। আপনার যদি একাধিক ফাইল থাকে তবে তারা কোথায় শুরু করবেন এবং থামবেন তা বলার কোনও উপায় নেই।

স্টিডিনের পড়া হিসাবে, আনজিপ ম্যান পৃষ্ঠাটিতে এই বাক্যটি রয়েছে:

স্ট্যান্ডার্ড ইনপুট থেকে পড়া সংরক্ষণাগারগুলি এখনও ফানজিপ ব্যতীত সমর্থিত নয় (এবং তারপরে কেবল সংরক্ষণাগারটির প্রথম সদস্যকেই তোলা যেতে পারে)।

ফানজিপ দিয়ে আপনার কিছু ভাগ্য থাকতে পারে।


জিপটির ভিতরে যদি একাধিক ফাইল থাকে, তবে -p প্যারামিটার হিসাবে ফাইলের নাম ব্যবহার করে একক ফাইল মুদ্রণ করতে পারে: আনজিপ-পি টেম্প.জিপ ফাইল-ইন-জিপ
তাভি ইলভেস

7

আপনি যা করতে চান তা হ'ল unzipএকটি যুক্তি হিসাবে বরং তার স্ট্যান্ডার্ড ইনপুটটিতে একটি জিপযুক্ত ফাইলটি তৈরি করুন। এটি সাধারণত আর্গুমেন্ট সহ সহজেই gzipএবং tarধরণের সরঞ্জাম দ্বারা সমর্থিত হয় -। কিন্তু মানটি এটি unzipকরে না (যদিও এটি কোনও পাইপে নিষ্কাশন সমর্থন করে)। যাইহোক, সব হারিয়ে যায় না ...

funzip ম্যানুয়াল পাতা।

ফাইল যুক্তি ছাড়াই ফানজিপ ফিল্টার হিসাবে কাজ করে; এটি হ'ল ধরে নেওয়া হয়েছে যে একটি জিপ সংরক্ষণাগার (বা একটি জিজিপ'ড ফাইল) স্ট্যান্ডার্ড ইনপুটটিতে পাইপ করা হচ্ছে এবং এটি সংরক্ষণাগার থেকে স্টাডআউটে প্রথম সদস্যকে বের করে। স্টিডিন যখন কোনও টিটিআই ডিভাইস থেকে আসে, ফানজিপ ধরে নেয় যে এটি (বাইনারি) সংকোচিত ডেটার প্রবাহ হতে পারে না এবং পরিবর্তে একটি সংক্ষিপ্ত সহায়তা পাঠ্য দেখায়। যদি কোনও ফাইল আর্গুমেন্ট থাকে তবে স্ট্যান্ডিনের পরিবর্তে নির্দিষ্ট ফাইল থেকে ইনপুট পড়তে হবে।

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

এটি বেশিরভাগ লিনাক্স আর্কাইভগুলি সাধারণত TAR'ed হয় এবং তারপরে কোনও উপায়ে জিপযুক্ত হয় (gzip, bzip, ইত্যাদি আল) এই ধারণার সাথে এটি ভাল goes আপনার যদি এটি থাকে তবে এটি আপনার পক্ষে কাজ করবে tar.ZIP


এটি লক্ষণীয় যে funzipতথ্য-জিপ মূল লেখক মার্ক অ্যাডলার লিখেছেন। তিনি ফানজিপ ম্যান পেজে লিখেছেন,

this functionality should be incorporated into unzip itself (future release).

তবে আশেপাশে এরকম কোনও আপডেট দেখা যায় না। আমি সন্দেহ করি যে অন্য আর্কাইভ পদ্ধতিগুলি টিআর দিয়ে সহজেই কাজ করেছিল বলে মার্ক এটিকে অপ্রয়োজনীয় বলে মনে করেছিল।


শুধু একটি মন্তব্য; কিছু লোক আনজিপ করার বিকল্প হিসাবে পাইথন বা কোনও ভাষা পছন্দ করতে পারে। একটি প্রধান উদাহরণ হেরোকু যা তার সিস্টেমে টার বা আনজাইপ অন্তর্ভুক্ত করে না। চারপাশের কাজটি জাভা ইনস্টল করে জার ব্যবহার করা যা অনুমোদিত which
নিক

এই উত্তরে ফানজিপ এবং অনুরূপ সরঞ্জামগুলির সীমাবদ্ধতাগুলি (বিশেষত কেবল একটি সংরক্ষণাগারটির প্রথম সদস্যকে দেখাতে সক্ষম) এর সাথে সীমাবদ্ধতার বিষয়ে আরও কিছু রয়েছে: unix.stackexchange.com/a/211286/77539
জোশুয়া গোল্ডবার্গ

6

আমি কার্লটি ব্যবহার করতে পছন্দ করি কারণ এটি ডিফল্টরূপে ইনস্টল করা হয় ( -Lযা প্রায়শই ঘটে পুনঃনির্দেশগুলির জন্য প্রয়োজন):

curl -L http://example.com/file.zip | bsdtar -xvf - -C /path/to/directory/

তবে, bsdtarডিফল্টরূপে ইনস্টল করা নেই এবং আমি কাজ করতে পারিনি funzip


একাধিক ফাইলের
সাথেও দুর্দান্ত

5

এটি আমার অনুরূপ প্রশ্নের জবাবের পুনঃপ্রবন্ধ :

জিপ ফাইল ফর্ম্যাটটিতে সংরক্ষণাগারটির শেষে একটি ডিরেক্টরি (সূচক) অন্তর্ভুক্ত রয়েছে। এই ডিরেক্টরিটি বলে যেখানে আর্কাইভের মধ্যে প্রতিটি ফাইল রয়েছে এবং এটি পুরো সংরক্ষণাগারটি না পড়ে দ্রুত, এলোমেলো অ্যাক্সেসের অনুমতি দেয়।

পাইপের মাধ্যমে একটি জিপ সংরক্ষণাগারটি পড়ার চেষ্টা করার সময় এটি কোনও সমস্যা হিসাবে দেখা দেবে, যাতে সূচিটি শেষ অবধি অ্যাক্সেস করা হয় না এবং ফাইলটি সম্পূর্ণরূপে পড়া না হওয়া অবধি পৃথক সদস্যদের সঠিকভাবে বের করা যায় না এবং আর উপলব্ধ না থাকে until । সংরক্ষণাগারটি যখন পাইপের মাধ্যমে সরবরাহ করা হয় তখন বেশিরভাগ জিপ ডিকম্প্রেসারগুলি কেবল ব্যর্থ হয় uns

সংরক্ষণাগারটির শেষে থাকা ডিরেক্টরিটি কেবলমাত্র স্থান নয় যেখানে ফাইল মেটা তথ্য সংরক্ষণাগারে সংরক্ষণ করা হয়। অতিরিক্ত হিসাবে, স্বতন্ত্র এন্ট্রিগুলিও অতিরিক্ত ফাইলের শিরোনামে অপ্রয়োজনীয় উদ্দেশ্যে এই তথ্য অন্তর্ভুক্ত করে।

যদিও প্রতিটি জিপ ডিকম্প্রেসর স্থানীয় ফাইল শিরোলেখ ব্যবহার করে না যখন সূচকটি অনুপলব্ধ থাকে, তারকোনা এবং সিপিও সামনের অংশটি লিবারচিভ (ওরফে বিএসডিটার এবং বিএসডিসিপিও) শেষ করতে পারে এবং পাইপের মাধ্যমে পড়ার সময় তা করতে পারে, যার অর্থ নিম্নলিখিতটি সম্ভব:

wget -qO- http://example.org/file.zip | bsdtar -xvf-

4

তথ্য-জিপ দিয়ে এটি সম্ভব নয় যা সর্বাধিক সাধারণ ওএসএস বাস্তবায়ন। আরও গুরুত্বপূর্ণ বিষয়, জিপ সংরক্ষণাগারগুলির নির্মাণের কারণে এটি প্রস্তাবিত নয়।

যদি আপনার কাছে বিন্যাসের পরিবর্তন কার্যকর হয় তবে তার পরিবর্তে ডার (1) ব্যবহারের বিষয়টি বিবেচনা করুন। এটি স্ট্রিমযুক্ত ইনপুট / আউটপুট নিয়ে বেশ খুশি এবং বাস্তবে এটি ডিফল্টরূপে প্রত্যাশা করে।

অতিরিক্ত হিসাবে আপনি প্রায়শই বলতে পারবেন যে কোনও অ্যাপ্লিকেশন কোনও ফাইলের নামের জন্য "-" নির্দিষ্ট করে স্ট্রিম ইনপুট / আউটপুট আশা করে কিনা। তথ্য-জিপ, আপনি কল্পনা করতে পারেন, এটি একটি কার্যকর যুক্তি হিসাবে বিবেচনা করে না।



3

এটি করার সহজলভ্য সাধারণ সাধারণ ইউটিলিটি jarহ'ল এটি অনুমান করবে যে আপনি যদি কোনও ফাইল আরগ পাস না করেন তবে এসটিডিআইএন ব্যবহার করা হচ্ছে। এটি tarঅপারেশনের জন্য প্রোগ্রামের অনুরূপ যুক্তিও গ্রহণ করে।

উদাহরণস্বরূপ একটি সংরক্ষণাগারের বিষয়বস্তু তালিকাভুক্ত করুন

curl https://my.example.com/file.zip | jar t

জাভা সর্বদা ইনস্টল না থাকা অবস্থায়, সেই মেশিনগুলিতে যেখানে এটি রয়েছে, এটি সম্ভবত এটি jarকরার সবচেয়ে সুবিধাজনক পদ্ধতি।


3

এর পুনরায় পোস্ট করুন আমার উত্তর :

ব্যজিবক্স স্টিন unzipনিতে এবং সমস্ত ফাইলগুলি বের করতে পারে।

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -

ড্যাশ পরে unzipস্ট্যান্ডিন ইনপুট হিসাবে ব্যবহার করা হয়।

আপনি এমনকি করতে পারেন,

cat file.zip | busybox unzip -

তবে এটি কেবল অপ্রয়োজনীয় unzip file.zip

যদি আপনার ডিস্ট্রো ডিফল্টরূপে ব্যাসিবক্স ব্যবহার করে (যেমন আলপাইন), কেবল চালান unzip -


1

আমার আসলে কিছুটা জটিল জটিল জিনিস দরকার ছিল - একটি নির্দিষ্ট ফাইল উপস্থিত থাকলে তা বের করুন। অসুবিধা হচ্ছে, ইনপুট ফাইল স্ট্রিমটি কোনও জিপ ফাইল নাও হতে পারে এবং যা ক্ষেত্রে পাইপ দিয়ে চালিয়ে যেতে আমার এটির প্রয়োজন হয়েছিল। এখানে আমার সমাধান (বেশিরভাগ জেসন আর। কমবস সমাধানকে ধন্যবাদ)

python -c "import zipfile,sys,StringIO
data=sys.stdin.read()
try:
    z=zipfile.ZipFile(StringIO.StringIO(data))
    z.open(\"$1\")
    sys.stdout.write(z.read(\"$1\"))
except (RuntimeError, zipfile.BadZipfile):
    sys.stdout.write(data)"

আমি এটিকে আমার মেশিনের "/ বিন" ফোল্ডারে "এফপিপটিপি" (কোনও সাধারণ নাম নয়) নামে একটি ফাইল হিসাবে সংরক্ষণ করেছি যাতে এটি পরীক্ষা করার মতো হয়:

cat defaultModel.mwb|effpoptp "document.mwb.xml"

উদ্দেশ্যটি হ'ল মাইএসকিউএল ওয়ার্কবেঞ্চ ফাইলগুলিকে সংস্করণ করা, যেখানে ফাইলটি ওয়ার্কবেঞ্চ ফাইল, বা সম্পূর্ণ ওয়ার্কবেঞ্চ ফাইল হিসাবে পরিচিত xML ফাইল হতে পারে।

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