फ़ाइलों को खोलना जो एक पाइप के माध्यम से उड़ रहे हैं


39

क्या मैं अनज़िप या किसी भी समान कार्यक्रम को मानक आउटपुट पर काम कर सकता हूं? स्थिति यह है कि मैं एक ज़िप फ़ाइल डाउनलोड कर रहा हूं, जिसे फ्लाई पर अनज़िप किया जाना चाहिए।

संबंधित समस्या: मैं बैश में मानक आउटपुट पर डाउनलोड की गई फ़ाइल को कैसे पाइप कर सकता हूं?


ऐसा लग रहा था कि यह करने योग्य होना चाहिए, लेकिन ऐसा लगता है कि केवल ज़िप को निकालना और फ़ाइल को किसी अन्य कमांड पर पाइप करना संभव है अगर ज़िप में केवल एक फ़ाइल हो। मैं एक बहु-फ़ाइल ज़िप से एक विशिष्ट फ़ाइल निकालना चाहता था। पाइपिंग के बजाय, मैंने कई कमांड 'अनज़िप फ़ाइल.ज़िप / पाथ / फाइल && dostuff / path / file && 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 के आउटपुट को अनज़िप करें।

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

1
आप और अजगर रॉक !!!
फरीद नूरी नेष्ट

3
एक-लाइनर और +1 का उल्लेख करने के लिए अच्छा है कि फ़ाइल को मेमोरी में फिट होना है। (फ़ाइल प्रारूप संरचना के कारण दुर्भाग्य से pkzip फ़ाइल को अनज़िप करने का कोई तरीका नहीं है)।
21

2
निकालने से पहले इस बफ़र्स को याद में सब कुछ ध्यान में रखें
विलियम कैसरिन

1
कोई कारण नहीं है कि इसे एक स्ट्रीम के रूप में नहीं पढ़ा जा सकता है यदि फ़ाइल मेमोरी में आसानी से फिट हो सकती है वास्तव में सटीक नहीं है। इससे पहले कि आप सामग्री निकालने के लिए मेमोरी में पूरे ज़िप संग्रह को बफर करने के लिए मजबूर हो जाएं, क्योंकि यह विशेष रूप से एक स्ट्रीम के रूप में पढ़ा नहीं जा सकता है। बेशक, यह अभी भी एक फ़ाइल के लिए ज़िप संग्रह लिखने से बचने के लिए उपयोगी हो सकता है।
हांक लिंडक्विस्ट

यह एक स्ट्रीम नहीं है, आप पूरी फ़ाइल को मेमोरी में पढ़ रहे हैं.read()
रोमेल्ड ब्रुनेट

17

यह काम करने की संभावना नहीं है कि आप कैसे उम्मीद करते हैं। ज़िप सिर्फ एक संपीड़न प्रारूप नहीं है, बल्कि एक कंटेनर प्रारूप भी है। यह एक में टार और gzip.bzip2 दोनों की नौकरियों को रोल करता है। यह कहने के बाद कि, यदि आपके ज़िप में एक ही फाइल है, तो आप फ़ाइलों को हटाने के लिए अनज़िप -p का उपयोग कर सकते हैं। यदि आपके पास एक से अधिक फ़ाइल हैं, तो आपके लिए यह बताने का कोई तरीका नहीं है कि वे कहाँ से शुरू और रोकें।

स्टड से पढ़ने के लिए, अनज़िप मैन पेज में यह वाक्य है:

मानक इनपुट से पढ़े गए अभिलेख अभी तक समर्थित नहीं हैं, केवल फ़ंजिप के साथ (और फिर संग्रह के केवल पहले सदस्य को निकाला जा सकता है)।

फनज़िप के साथ आपकी कुछ किस्मत हो सकती है।


जिप एकाधिक फ़ाइलों के अंदर है, तो -p बाहर एकल फाइल एक पैरामीटर के रूप फ़ाइल नाम का उपयोग मुद्रित कर सकते हैं: unzip -p temp.zip फ़ाइल-अंदर-जिप
तावी Ilves

7

आप क्या करना चाहते हैं, unzipएक तर्क के रूप में इसके मानक इनपुट पर एक ज़िप्ड फ़ाइल लें। यह आमतौर पर एक तर्क के साथ आसानी से gzipऔर tarतरह के उपकरणों द्वारा समर्थित है -। लेकिन मानक unzipऐसा नहीं करता है (हालांकि, यह एक पाइप के लिए निष्कर्षण का समर्थन करता है)। वैसे, सबकुछ नष्ट नहीं हुआ है...

को देखो funzip मैनुअल पृष्ठ।

एक फ़ाइल तर्क के बिना funzip एक फिल्टर के रूप में कार्य करता है; यही है, यह मानता है कि एक ज़िप संग्रह (या एक gzip'd फ़ाइल) को मानक इनपुट में पाइप किया जा रहा है, और यह संग्रह से पहले सदस्य को stdout में निकालता है। जब स्टड एक ट्टी डिवाइस से आता है, तो फ़नज़िप मान लेता है कि यह (बाइनरी) संपीड़ित डेटा की एक धारा नहीं हो सकती है और इसके बजाय एक छोटी मदद पाठ दिखाती है। यदि कोई फ़ाइल तर्क है, तो स्टड से निर्दिष्ट फ़ाइल के बजाय इनपुट पढ़ा जाता है।

एकल-सदस्य निष्कर्षण पर सीमा को देखते हुए, funzip टार (1) जैसे एक माध्यमिक अभिलेखीय कार्यक्रम के साथ संयोजन के रूप में सबसे अधिक उपयोगी है। निम्न अनुभाग में डिस्क बैकअप के मामले में टेप के लिए इस उपयोग को दर्शाने वाला एक उदाहरण शामिल है।

यह इस विचार के साथ अच्छी तरह से जाना जाता है कि अधिकांश लिनक्स अभिलेखागार आमतौर पर TAR'ed होते हैं और फिर किसी तरह से ज़िप किए जाते हैं (gzip, bzip, et al)। यह आपके लिए काम करेगा यदि आपके पास ए tar.ZIP


यह ध्यान देने योग्य है कि funzipइन्फो-जिप मूल लेखक मार्क एडलर द्वारा लिखी गई है। वह फ़नज़िप मैन पेज में लिखते हैं,

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

हालाँकि, ऐसा कोई अपडेट आसपास नहीं देखा गया है। मुझे संदेह है कि मार्क ने इसे अनावश्यक पाया क्योंकि अन्य संग्रह विधियों ने TAR के साथ आसानी से काम किया।


सिर्फ एक टिप्पणी; कुछ लोग अजगर या किसी भी भाषा को अनज़िप करने के विकल्प के रूप में पसंद करेंगे। एक प्रमुख उदाहरण हेरोकू है जिसमें अपने सिस्टम पर टार या अनज़िप शामिल नहीं है। चारों ओर एक कार्य जावा का उपयोग करके जार का उपयोग करना है जिसे अनुमति दी गई है।
निक

फ़नज़िप और इसी तरह के उपकरणों की सीमाओं के साथ काम करने के बारे में अधिक है (विशेष रूप से केवल एक संग्रह के पहले सदस्य को दिखाने में सक्षम होने के नाते) इस उत्तर में: unix.stackexchange.com/a/211286/77539
जोशुआ गोल्डबर्ग

6

मैं कर्ल का उपयोग करना पसंद करता हूं क्योंकि यह डिफ़ॉल्ट रूप से स्थापित होता है (यह -Lरीडायरेक्ट के लिए आवश्यक होता है जो अक्सर होता है):

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

हालाँकि, bsdtarडिफ़ॉल्ट रूप से स्थापित नहीं है, और मुझे funzipकाम करने के लिए नहीं मिला ।


इसके अलावा एकाधिक फ़ाइलों के साथ ठीक काम करता है
jonnor

5

यह एक समान प्रश्न के लिए मेरे उत्तर का एक प्रतिनिधि है :

ज़िप फ़ाइल प्रारूप में संग्रह के अंत में एक निर्देशिका (सूचकांक) शामिल है। यह निर्देशिका कहती है कि, पुरालेख के भीतर प्रत्येक फ़ाइल स्थित है और इस प्रकार पूरे संग्रह को पढ़े बिना त्वरित, यादृच्छिक अभिगम की अनुमति देता है।

एक पाइप के माध्यम से जिप संग्रह को दिखाने का प्रयास करते समय यह समस्या सामने आएगी, जिसमें सूचकांक को बहुत अंत तक एक्सेस नहीं किया जा सकता है और इसलिए व्यक्तिगत सदस्यों को तब तक सही ढंग से नहीं निकाला जा सकता है जब तक कि फाइल पूरी तरह से पढ़ नहीं ली जाती है और अब उपलब्ध नहीं है। । जैसा कि यह बहुत ही आश्चर्यजनक प्रतीत होता है कि ज्यादातर ज़िप डिकम्प्रेसर्स बस विफल हो जाते हैं जब संग्रह एक पाइप के माध्यम से आपूर्ति की जाती है।

संग्रह के अंत में निर्देशिका एकमात्र स्थान नहीं है जहां फ़ाइल मेटा जानकारी को संग्रह में संग्रहीत किया जाता है। इसके अलावा, व्यक्तिगत प्रविष्टियों में अतिरेक उद्देश्यों के लिए एक स्थानीय फ़ाइल हेडर में यह जानकारी भी शामिल है।

हालांकि हर ज़िप डिकम्प्रेसर स्थानीय फ़ाइल हेडर का उपयोग नहीं करेगा, जब अनुक्रमणिका अनुपलब्ध है, टार और cpio फ्रंट लिबेरक्टिव (उर्फ bsdtar और bsdcpio) के लिए समाप्त होता है और पाइप के माध्यम से पढ़ते समय ऐसा करेगा , जिसका अर्थ है कि निम्नलिखित संभव है:

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

4

यह इन्फो-जिप के साथ संभव नहीं है जो सबसे आम ओएसएस कार्यान्वयन है। अधिक महत्वपूर्ण बात यह है कि, यह जिप अभिलेखागार के निर्माण के कारण अनुशंसित नहीं है।

यदि प्रारूप का परिवर्तन आपके लिए व्यवहार्य है, तो इसके बजाय टार (1) का उपयोग करने पर विचार करें। यह स्ट्रीम किए गए इनपुट / आउटपुट से काफी खुश है और वास्तव में, डिफ़ॉल्ट रूप से इसकी अपेक्षा करता है।

इसके अतिरिक्त, आप अक्सर यह बता सकते हैं कि क्या एप्लिकेशन एक फ़ाइल नाम के लिए "-" निर्दिष्ट करके इनपुट / आउटपुट स्ट्रीम करता है। जानकारी-ज़िप, जैसा कि आप कल्पना कर सकते हैं, इसे एक वैध तर्क के रूप में नहीं मानते हैं।



3

यह उपलब्ध सबसे सरल सामान्य उपयोगिता है jar, जो यह मानती है कि यदि कोई फ़ाइल args नहीं है तो STDIN का उपयोग किया जा रहा है। यह 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)"

मैंने इसे अपनी मशीन पर "/ बिन" फ़ोल्डर में "effpoptp" (एक साधारण नाम नहीं) नाम की फ़ाइल के रूप में सहेजा है, इसलिए इसका परीक्षण इस तरह है:

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

उद्देश्य MySQL वर्कबेंच फ़ाइलों को नियंत्रित करने के लिए है, जहाँ फ़ाइल xml फ़ाइल हो सकती है जिसका नाम वर्कबेंच फ़ाइल या पूर्ण वर्कबेंच फ़ाइल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.