सवाल पाइप के माध्यम से उड़ रहे फ़ाइलों को अनजिप करना


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

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


36
2018-06-16 12:32


मूल


ऐसा लगता है कि यह करने योग्य होना चाहिए, लेकिन ऐसा लगता है कि ज़िप को निकालने और फ़ाइल को किसी अन्य कमांड पर पाइप करना संभव है यदि ज़िप में केवल एक फ़ाइल है। मैं एक बहु फ़ाइल ज़िप से एक विशिष्ट फ़ाइल निकालना चाहता था। पाइपिंग के बजाए, मैंने कई कमांड 'unzip file.zip / path / file && dostuff / path / file && rm -rf / path' को चालू करने के लिए स्विच किया, मूल प्रश्न का उत्तर नहीं देते, और जिसके परिणामस्वरूप अस्थायी फ़ाइलें बनाई गईं, यह मेरी संतुष्टि से संतुष्ट है जरुरत। - Stan Kurdziel
पिगज़ देखें। हम इसे एक पाइप में उपयोग करते हैं। andrew.tumblr.com/post/2316602611 - dmourati


जवाब:


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

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

21
2018-06-15 19:44



आप और अजगर चट्टान !!! - Farid Nouri Neshat
अच्छा एक-लाइनर, और +1 यह उल्लेख करने के लिए कि फ़ाइल को स्मृति में फिट होना है। (फ़ाइल प्रारूप संरचना के कारण दुर्भाग्य से एक pkzip फ़ाइल को अनजिप करने का कोई तरीका नहीं है)। - lxgr
निकालने से पहले इस बफर को स्मृति में सब कुछ ध्यान में रखें - William Casarin
फ़ाइल को आसानी से पर्याप्त रूप से फिट करने पर फ़ाइल के रूप में इसे पढ़ा नहीं जा सकता है, इसका कोई कारण नहीं है वास्तव में सटीक नहीं है। इससे पहले कि आप सामग्रियों को निकालने से पहले स्मृति में पूरे ज़िप संग्रह को बफर करने के लिए मजबूर हो जाएं, विशेष रूप से क्योंकि इसे स्ट्रीम के रूप में नहीं पढ़ा जा सकता है। बेशक, यह फ़ाइल में ज़िप संग्रह लिखने से बचने के लिए अभी भी उपयोगी हो सकता है। - Håkan Lindqvist
ये है नहीं एक धारा, आप पूरी फ़ाइल को स्मृति का उपयोग करके पढ़ रहे हैं .read() तरीका - Romuald Brunet


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

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

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

आप funzip के साथ कुछ भाग्य हो सकता है।


17
2018-06-16 12:45



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


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

की ओर देखें funzip मैनुअल पेज

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

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

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


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

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

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


7
2018-06-16 12:46



बस एक टिप्पणी; कुछ लोग पाइथन या किसी भी भाषा को अनजिप करने के विकल्प के रूप में पसंद करेंगे। एक प्रमुख उदाहरण हेरोोकू है जिसमें इसके सिस्टम पर टैर या अनजिप शामिल नहीं है। जावा के जरिए जार का उपयोग करने के लिए एक काम है जो अनुमति है। - Nick
इस जवाब में funzip और इसी तरह के औजारों (विशेष रूप से केवल एक संग्रह के पहले सदस्य को दिखाने में सक्षम होने) की सीमाओं से निपटने के बारे में और कुछ है: unix.stackexchange.com/a/211286/77539 - Joshua Goldberg


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

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

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


6
2018-03-05 15:47



कई फाइलों के साथ भी ठीक काम करता है - jonnor


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

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

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


4
2018-06-16 12:53





Zsh में, आप निम्न कार्य कर सकते हैं:

unzip =( curl http://example.com/someZipFile.zip )

4
2017-11-14 22:09





यह एक repost है मेरा जवाब एक समान प्रश्न के लिए:

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

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

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

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

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

4
2018-04-16 17:54





मुझे वास्तव में थोड़ा और जटिल कुछ चाहिए - यदि यह मौजूद है तो एक विशिष्ट फ़ाइल निकालें। कठिनाई होने पर, इनपुट फ़ाइल स्ट्रीम एक ज़िप फ़ाइल नहीं हो सकती है, और इस मामले में, मुझे पाइप के माध्यम से जारी रखने की आवश्यकता थी। यहां मेरा समाधान है (जेसन आर कॉम्ब्स समाधान के लिए धन्यवाद)

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)"

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

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

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


1
2017-11-13 18:01





उपलब्ध सबसे सरल सामान्य उपयोगिता यह होगी jar, जो एसटीडीआईएन का अनुमान लगाया जा रहा है यदि आप इसे कोई फ़ाइल तर्क नहीं देते हैं। यह भी इसी तरह के तर्क लेता है tar संचालन के लिए कार्यक्रम।

जैसे एक संग्रह की सामग्री सूचीबद्ध करें

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

जबकि जावा हमेशा स्थापित नहीं होता है, उन मशीनों पर जहां यह है, jar यह निश्चित रूप से करने का सबसे सुविधाजनक तरीका है।


1
2018-06-04 12:15





का दोबारा मेरा जवाब:

बिजीबॉक्स की unzip stdin ले सकते हैं और सभी फ़ाइलों को निकालें।

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

बाद में डैश unzip इनपुट के रूप में stdin का उपयोग करना है।

तुम भी,

cat file.zip | busybox unzip -

लेकिन यह सिर्फ अनावश्यक है unzip file.zip

यदि आपका डिस्ट्रो डिफ़ॉल्ट रूप से BusyBox का उपयोग करता है (उदा। अल्पाइन), बस चलाएं unzip -


0
2017-10-11 12:13