2013-06-05 16 views
14

का उपयोग करते समय शेल 'टैर: संग्रह में नहीं मिला' त्रुटि जब मैं वर्तमान निर्देशिका में सभी .gz फ़ाइलों को निकालने के लिए tar -xzf *.gz का उपयोग करता हूं, तो मुझे Not found in archive त्रुटि मिलती है। हालांकि, यह ठीक काम करता है अगर मैं एक के बाद एक को निकालने या की तरहनियमित अभिव्यक्ति

for file in `ls *.gz`; do tar -xzf $file; done 

इस त्रुटि के लिए कारण क्या है एक के लिए लूप का उपयोग करें?

+0

यह तथ्य की उस कथन की वाक्य रचना के कारण होता है टैर कमांड लाइन में केवल एक सिंगल टैर स्वीकार करते हैं और बाकी को कुछ और के रूप में व्याख्या किया जाता है। आप xargs भी ('ls * .gz | xargs -n1 tar -xzf' या समान रूप से) का उपयोग कर सकते हैं। – ShinTakezou

+0

टैर ग्लोब पैटर्न को तर्क के रूप में स्वीकार नहीं करता है (यानी यह इसकी व्याख्या नहीं करेगा) afaik – ShinTakezou

+0

@ShinTakezou: लेकिन खोल '* .gz' नोटेशन का विस्तार करेगा; 'tar' (आमतौर पर)' * .gz' नहीं देखेगा। कभी-कभी, आप नाम में '*' के साथ फ़ाइलों को निकालना चाहते हैं। उदाहरण के लिए: 'tar -xf abc.tar.gz 'src/prog/* name। *'' Src/prog/bigname.c', 'src/prog/smallname.h' जैसी फ़ाइलों को निकालेगा; सिंगल कोट्स '*' और 'tar' को विस्तारित करने से खोल को रोकता है, वास्तव में इसका विस्तार करता है। –

उत्तर

16

जब आप लिखें:

tar -xf *.gz 

tar आदेश (उदाहरण के लिए) देखता है:

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz 

यह एक अनुरोध संग्रह abc.tar.gz से def.tar.gz और ghi.tar.gz निकालने के लिए के रूप में व्याख्या की है। चूंकि फाइलें वहां नहीं हैं, इसलिए आपको चेतावनी संदेश मिलता है।

दूसरे शब्दों में, tar एक समय में एक ही tar फ़ाइल (संभावित रूप से संपीड़ित) पर चल रहा है (एक आमंत्रण में)। यह एकाधिक टैर फ़ाइलों पर काम नहीं करता है।

ध्यान दें कि यदि abc.tar.gz एक फ़ाइल pqr/xyz/important.c होता है, आप निर्दिष्ट करने के द्वारा सिर्फ एक फ़ाइल निकालने कर सकते हैं:

tar -xf abc.tar.gz pqr/xyz/important.c 

अंकन आप इस्तेमाल किया इस अंकन पर केवल एक संस्करण है।

(और हाँ, tartar फ़ाइल के कारण हो सकते हैं। उदाहरण के लिए, जीमेल आपको टैर फ़ाइल या एक गैजिप टैर फ़ाइल भेजने की अनुमति नहीं देता है जिसमें निष्पादन योग्य फ़ाइल होती है। हालांकि, अगर आप एम्बेड करते हैं एक गैर संकुचित tar फाइल के अंदर Gzipped टार फ़ाइल, यह आंतरिक फ़ाइल के अंदर दिखता है नहीं निष्पादन योग्य फ़ाइल खोजने के लिए। मैं इस का उपयोग जब मैं एक निष्पादन configure स्क्रिप्ट के साथ एक टार फ़ाइल जहाज की जरूरत है।)

18

जब आप लिखना

tar -xzf *.gz 

आपका खोल स्ट्रिंग में फैलता है:

tar -xzf 1.gz 2.gz 3.gz 

(माना जाता है कि 1.gz, 2.gz और 3.gz आप वर्तमान निर्देशिका में हैं)।

tar सोचता है कि आप 2.gz और 3.gz1.gz से निकालना चाहते हैं; वह इन फ़ाइलों को अभिलेखागार में नहीं ढूंढ सकता है और जो त्रुटि संदेश का कारण बनता है।

आपको अपनी फ़ाइलों को निकालने के लिए xargs कमांड के लूप for का उपयोग करने की आवश्यकता है।

ls *.gz |xargs -n1 tar -xzf 

इसका मतलब है कि: मुझे मौजूदा निर्देशिका में हर gz -file के लिए tar -xzf चलाते हैं।

3

मुख्य कारण tar एक फ़ाइल नाम तर्क लेता है। जब आप tar *.tgz बैश को कॉल कर रहे हैं तो * को tgz formant के साथ सभी फ़ाइल नामों में विस्तारित करता है और यह tar file1 file2 file3 बन जाता है जिसे tar द्वारा स्वीकार नहीं किया जाता है।तो या तो आप या for i in *.tgz; do tar -zxvf $i ;done तरह पाश के लिए एक का उपयोग कुछ अन्य आदेश जो एक पक्ष प्रभाव के रूप tar कार्यान्वित टिप्पणियों में दिखाया गया है की तरह उपयोग करते हैं, है ls या find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls उत्पादन हमेशा जोखिम भरा है)

+0

एलएस आउटपुट हमेशा जोखिम भरा क्यों है? –

+0

'एलएस' से आउटपुट संदिग्ध है यदि नामों में सफेद स्थान या न्यूलाइन हैं। सफेद जगह के बिना नाम (बिना न्यूलाइन सहित), यह ठीक है, लेकिन आप इन दिनों अंतरिक्ष के बिना नामों पर भरोसा नहीं कर सकते हैं। –

+0

@ जोनाथन लेफ्लर, हाँ, यह है! धन्यवाद –

संबंधित मुद्दे