एकल टार कॉल के साथ कई .tar.gz फ़ाइलों को निकालें


35

मैं सोच रहा था कि क्या (और, ज़ाहिर है, कैसे) tarएक ही रन में कई फ़ाइलों को निकालना संभव है ।

मैं कई वर्षों से एक अनुभवी यूनिक्स उपयोगकर्ता हूं और निश्चित रूप से मुझे पता है कि आप उपयोग कर सकते हैं forया findइस तरह की चीजों को tarएक बार प्रत्येक संग्रह के लिए कॉल कर सकते हैं जिसे आप निकालना चाहते हैं, लेकिन मैं एक काम करने वाली कमांड लाइन के साथ नहीं आ सका जो मेरे कारण हुआ tarएक बार में दो .tar.gz फ़ाइलों को निकालने के लिए। (और नहीं, इसमें कुछ भी गलत नहीं है for, मैं केवल यह पूछ रहा हूं कि क्या इसके बिना करना संभव है।)

मैं यह सवाल जिज्ञासा से बाहर पूछ रहा हूं, हो सकता है

  • वहाँ एक अजीब कांटा tarहै कि इस का समर्थन करता है
  • किसी को पता है कि जब मैंने कोशिश की थी तो -Mउस पैरामीटर का उपयोग कैसे करेंtartar -zxv -f a.tgz -f b.tgz
  • हम सभी अंधे हैं और ऐसा करना पूरी तरह से आसान है - लेकिन मुझे वेब में ऐसा कोई संकेत नहीं मिला जो उपयोग forया findया पसंद न किया हो xargs

कृपया जवाब न दें tar -zxvf *.tar.gz(क्योंकि यह काम नहीं करता है) और केवल "काम नहीं करता है" के साथ उत्तर दें यदि आप इसके बारे में पूरी तरह से निश्चित हैं (और शायद एक अच्छा स्पष्टीकरण क्यों है , भी)।

संपादित करें: मुझे स्टैक ओवरफ्लो पर इस प्रश्न के उत्तर की ओर इशारा किया गया था, जो बहुत विस्तार से कहता है कि यह वर्तमान tarसिंटैक्स को तोड़ने के बिना संभव नहीं है , लेकिन मुझे नहीं लगता कि यह सच है। का उपयोग करना tar -zxv -f a.tgz -f b.tgzया tar -zxv --all-args-are-archives *.tar.gzकोई मौजूदा सिंटैक्स को तोड़ना नहीं होगा, imho।


जिज्ञासा से बाहर, वह कौन सी स्थिति है जिसके कारण आप यह सोचने लगे हैं कि लूपिंग निर्माण से कैसे बचा जाए?
अंकलजामिल

1
FYI करें: GNU टार पैरामीटर के साथ बहु-मात्रा टार अभिलेखागार का समर्थन करता है -M
स्टीव-ओ

1
unclejamil: मैं एक HowTo लिख रहा हूं और इसमें से एक चरण में कई संपीड़ित फाइलें (.tar.bz2, .tar.gz, .zip) को अनपैक करना शामिल है। और चूंकि यह एक हाउटो है, मैं सोच रहा था कि ऐसा करने के लिए सबसे सुरुचिपूर्ण कमांड लाइन क्या होगी। :)
scy

जवाबों:


39

यह संभव है, वाक्य रचना बहुत आसान है:

$ cat *.tar | tar -xvf - -i

-I विकल्प, मैन पेज से टार अभिलेखागार के अंत में ईओएफ की उपेक्षा करता है:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

1
यह मेरे लिए काम करने लगा। सटीक आदेश मैं इस्तेमाल किया गया था cat *.tar.bz2 | tar -ixjv:। धन्यवाद!
स्कैफ़

1
<Tgz के लिए> cat * .tgz | tar -xzvf - -i -C / गंतव्य / <या> फ़ाइल में .tgz के लिए; do tar -xzvf $ फ़ाइल -C / गंतव्य /; किया
फेरो

27

* .tar.gz के लिए

for file in *.tar.gz; do tar -zxf "$file"; done

* .tar.bz2 के लिए

for file in *.tar.bz2; do tar -jxf "$file"; done

* .tar.xz के लिए

for file in *.tar.xz; do tar -Jxf "$file"; done

1
यहां प्रारूपण ठीक करें, और यह अधिक पठनीय होगा।
eyoung100

यह महान है। प्रारूप भी महान है क्योंकि यह कैसे टर्मिनल में दिखता है
smatthewenglish

1
$fileयदि आपकी फ़ाइलों के नाम स्थान के साथ हों, तो उद्धरण देना न भूलें ।
अलेक्जेंडर रेवो

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

2

आपको एक लूप का उपयोग करने की आवश्यकता है। यह tarकई -fविकल्पों की अनुमति देने के लिए कमांड लाइन सिंटैक्स को नहीं तोड़ता है , लेकिन इसमें कई अभिलेखों को संसाधित करने के लिए कोड जोड़ने की आवश्यकता होगी, सभी प्रकार की किनारे की स्थितियों के साथ (क्या होगा यदि बीच में एक संग्रह विकृत हो गया हो? क्या अभिलेख अलग-अलग उपयोग कर सकते हैं? संपीड़न तंत्र? क्या आपके पास कई -Cविकल्प (किसी विशेष निर्देशिका में निकालने के लिए GNU टार विकल्प) भी हो सकते हैं? क्या? -K (GNU टार विकल्प एक निश्चित सदस्य नाम पर शुरू करने के लिए)?…)।

forलूप से बचने की एक संभावना AVFS , एक FUSE फाइल सिस्टम को स्थापित और सक्रिय करना है , जो अभिलेखागार तक पारदर्शी पहुंच प्रदान करता है। प्रत्येक संग्रह /path/to/archiveएक निर्देशिका के रूप में दोगुना हो जाता है ~/.avfs/path/to/archive#। यदि आप वाइल्डकार्ड के साथ अभिलेखागार का मिलान करना चाहते हैं, तो #वाइल्डकार्ड मैच में जोड़ने की बाधा है ; यह zsh में किया जा सकता है।

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


यह क्या करता है?
पियरे.विरेंस

1
यह प्रत्येक पाए गए फ़ाइल के लिए एक बार एक अंतर्निहित लूप कॉलिंग टार का परिचय देता है, और उपयोगकर्ता कहता है कि वे पहले से ही जानते हैं कि यह कैसे करना है।
Kusalananda

खेद है कि प्रश्न को ध्यान से नहीं पढ़ा, मैं सिर्फ कई टार पैक निकालने का तरीका खोज रहा था, ऊपर दिए गए उत्तर को पढ़ें और सोचें कि खोज अधिक आसान होगी।
zjengjie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.