Unzip इनपुट के रूप में wget के आउटपुट को पुनर्निर्देशित कैसे करें?


131

मुझे इस लिंक से एक फाइल डाउनलोड करनी है । फ़ाइल डाउनलोड एक ज़िप फ़ाइल है जिसे मुझे वर्तमान फ़ोल्डर में अनज़िप करना होगा।

आम तौर पर, मैं इसे पहले डाउनलोड करूंगा, फिर अनज़िप कमांड चलाऊंगा।

$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
$ unzip temp.zip

लेकिन इस तरह, मुझे दो कमांड निष्पादित करने की आवश्यकता है, अगले एक को निष्पादित करने के लिए पहले एक के पूरा होने की प्रतीक्षा करें, साथ ही, मुझे temp.zipइसे देने के लिए फ़ाइल का नाम पता होना चाहिए unzip

क्या इसका पुनर्निर्देशित करना संभव wgetहै unzip? कुछ इस तरह

$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`

लेकिन यह काम नहीं किया।

बैश: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zipअस्पष्ट अस्पष्ट

इसके अलावा, wgetदो बार निष्पादित किया गया, और फ़ाइल को दो बार डाउनलोड किया।


बाद के उदाहरण में, wget को संभवतः दो बार निष्पादित किया गया था क्योंकि? खोल में एक विशेष चरित्र है। URL को "" में डालकर मदद करनी चाहिए।
p-static

इस धागे का एक समाधान है। हालांकि यह खुद की कोशिश नहीं की है। serverfault.com/questions/26474/…

जवाबों:


96

आपको अपनी फ़ाइलों को एक अस्थायी फ़ाइल में डाउनलोड करना होगा, क्योंकि (अनज़िप मैन पेज को उद्धृत करना):

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

बस आदेशों को एक साथ लाओ:

wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip

लेकिन इसे और अधिक लचीला बनाने के लिए आपको संभवतः इसे एक स्क्रिप्ट में डालना चाहिए ताकि आप कुछ टाइपिंग को बचा सकें और यह सुनिश्चित करने के लिए कि आप गलती से किसी ऐसी चीज़ को अधिलेखित न कर दें जिससे आप mktempअपने अस्थायी फ़ाइल के लिए एक सुरक्षित फ़ाइल नाम बनाने के लिए कमांड का उपयोग कर सकें :

#!/bin/bash
TMPFILE=`mktemp`
PWD=`pwd`
wget "$1" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE

के wget file.zip && unzip file.zipरूप में ही है wget file.zip; unzip file.zipया एक दूसरे पर पसंद किया जाता है? धन्यवाद :)
jaggedsoft

7
@NextLocal wget && unzipकेवल तभी unzip चलेगा जब wget सफल हुआ। wget ; unzipवैसे भी अनज़िप चलेगा, संभवतः गैर-मौजूद फ़ाइल की ओर इशारा करता है।
टेम्पो

funzip मैं जवाब की तलाश में था। Terraform (किसी कारण के लिए) यह एक ज़िप फ़ाइल में एकल फ़ाइल के रूप में बाइनरी है, इसलिए यह मेरे लिए एकदम सही था।
असफंद क़ाज़ी

74

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

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

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

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

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

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

1
यह उत्कृष्ट है! मुझे लगता है कि टार मुझे असम्पीडित डेटा के गलत आकार (अपेक्षित 0) होने के बारे में कुछ चेतावनियाँ देता है, लेकिन फाइलें खुद ही दिखाई देने लगती हैं। ऐसा लगता है कि यह सूचकांक की कमी के कारण है।
व्याट8740

1
मैं .zipयहाँ एक है कि निष्पादन योग्य अनुमतियों के साथ फाइल शामिल है। जब मैं डाउनलोड करता हूं और पाइप करता हूं bsdtar, तो निष्पादन बिट्स को फेंक दिया जाता है। जब मैं डिस्क पर डाउनलोड करता हूं और उसके साथ bsdtarया unzipफिर एक्स्ट्रेक्ट बिट्स को सम्मानित किया जाता है।
गोलेर रामबेल

//, @GolarRamblar, क्या कभी पता नहीं क्यों?
नाथन बसानी

1
@ नथनबासानी: यहाँ जवाब है। संक्षेप में: एक ज़िप संग्रह में दो स्थान होते हैं जहां यह ऐसी जानकारी संग्रहीत करता है, जो असंगत हो सकती है, और यह निर्भर करता है कि फ़ाइल bsdtarखुलती है या नहीं यह एक या दूसरी जगह का उपयोग करती है।
गोलेर रामबेल १५

20

यदि आपके पास JDK स्थापित है, तो आप इसका उपयोग कर सकते हैं jar:

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin

3
मैंने अभी पाया कि jarफ़ाइल अनुमतियाँ संरक्षित नहीं है। अच्छी चाल है अन्यथा।
फुनेहे

7
आप एक फ़ाइल परम देने की जरूरत नहीं है, बस का उपयोग| jar xv
cricket_007

15

मुझे नहीं लगता कि आप पाइपिंग विंग के आउटपुट को अनज़िप में भी परेशान करना चाहते हैं।

विकिपीडिया "ज़िप (फ़ाइल प्रारूप)" लेख से:

एक ज़िप फ़ाइल को फ़ाइल के अंत में स्थित केंद्रीय निर्देशिका की उपस्थिति से पहचाना जाता है।

wget को पूरी तरह से डाउनलोड करने से पहले पूरा करना होगा क्योंकि unzip कोई भी काम कर सकता है, इसलिए वे क्रमिक रूप से चलते हैं, इंटरव्यू नहीं करते जैसा कि कोई सोच सकता है।


10

उचित सिंटैक्स होगा:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)

लेकिन यह काम नहीं करेगा, क्योंकि त्रुटि ( जानकारी- डेबियन पर ज़िप ):

lseek(3, 0, SEEK_SET)                   = -1 ESPIPE (Illegal seek)

Archive:  /dev/fd/63
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of /dev/fd/63 or
        /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period.

या बीएसडी / ओएस एक्स पर:

Trying to read large file (> 2 GiB) without large file support

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

तो आप निम्नलिखित workarounds है:

  • विभिन्न प्रकार के संपीड़न का उपयोग करें (जैसे tar.gz),
  • आपको दो अलग-अलग कमांड का उपयोग करना होगा,
  • वैकल्पिक साधनों का उपयोग करें (जैसा कि अन्य उत्तरों में सुझाया गया है),
  • कई कमांड का उपयोग करने के लिए एक उपनाम या फ़ंक्शन बनाएं।

मुझे लगता है कि यह अभी भी एक फीफो हो सकता है। आपको केवल EIF तक FIFO से पढ़ना जारी रखना होगा (प्रभावी रूप से पूरे FIFO को मेमोरी या टेम्पर्ड फाइल में बफर करना)। स्क्रिप्ट निर्माण को आसान बनाने के लिए पूरी तरह से संभव है, लेकिन बहुत उपयोगी नहीं है।
इवान कैरोल

8

मेरे उत्तर की पुनर्स्थापना :

बिजीबॉक्स की 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

यह मेरे लिए बहुत अच्छा काम करता है:

tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf -

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.