Tar.gz से विशिष्ट फ़ाइल कैसे निकालें


104

हम बड़ी tar.gz फ़ाइल से विशिष्ट फाइलें कैसे निकाल सकते हैं? मुझे इस प्रश्न में एक टार से फाइलें निकालने की प्रक्रिया मिली , लेकिन, जब मैंने वहां बताई गई कमांड की कोशिश की, तो मुझे त्रुटि मिली:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

फिर मैं एक फ़ाइल कैसे निकालूं tar.gz?


ध्यान दें कि किसी भी समाधान को पहले पूरे संग्रह को समझना चाहिए: superuser.com/questions/655739/… यदि आप इससे बचना चाहते हैं, तो आपको ज़िप जैसे किसी अन्य प्रारूप का उपयोग करना होगा। हालांकि, ज़िप कम संपीड़न देगा, क्योंकि यह अलग-अलग फ़ाइल को अलग-अलग संपीड़ित करता है: superuser.com/questions/1013309/… मुझे आश्चर्य है कि अगर कोई प्रारूप है जो एक फ़ाइल को निकालने के लिए गति और क्षमता दोनों का समर्थन करता है।
सीरो सेंटिल्ली 新疆 改造 iro 六四 事件

जवाबों:


119

आप भी उपयोग कर सकते हैं tar -zxvf <tar filename> <file you want to extract>

आपको फ़ाइल का नाम सटीक होना चाहिए जैसा tar ztf test.tar.gzकि यह दिखाता है। यदि यह कहता है जैसे ./extract11, या some/bunch/of/dirs/extract11, आपको जो देना है (और फ़ाइल उसी नाम के तहत दिखाई देगी, आवश्यक निर्देशिकाएं स्वचालित रूप से बनाई जाती हैं)।

  • -x: फ़ाइलों को निकालने के लिए टार को निर्देश देता है।
  • -f: फ़ाइल नाम / टारबॉल नाम निर्दिष्ट करता है।
  • -v: वर्बोज़ (फाइलें निकालते समय प्रगति दिखाएं)।
  • -z: gzip के माध्यम से फ़िल्टर संग्रह, decompress .gz फ़ाइलों का उपयोग करें।

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
अंकित वशिष्ठ

1
फिर यह कोशिश करें। tar tf archive.tar.gz | grep extract11कृपया देखें कि अर्क 11 संग्रह में है या नहीं
harish.venkat

8
आपको फ़ाइल का नाम सटीक होना चाहिए जैसा tar ztf test.tar.gzकि यह दिखाता है। यदि यह कहता है जैसे ./extract11, या some/bunch/of/dirs/extract11, आपको जो देना है (और फ़ाइल उसी नाम के तहत दिखाई देगी, आवश्यक निर्देशिकाएं स्वचालित रूप से बनाई जाती हैं)।
वॉनब्रांड २१'१३

मैं यहां एक बिंदु जोड़ना चाहूंगा, -zविकल्प एचपी-यूएक्स जैसे यूनिक्स के कुछ संस्करणों में काम नहीं करता है।
अंकित वशिष्ठ

1
@ pj-brunet: नहीं, fअंत में नहीं होना चाहिए। लेकिन इसे सीधे फ़ाइल नाम से पालन किया जाना चाहिए। टार नाम ठीक होने के बाद अन्य सभी विकल्पों के साथ यह उदाहरण है tar -f mytar.tar.gz -zxv dir/somefile:। यह "mytar.tar.gz" से "dir / somefile" निकालता है।
mivk

34

मान लेते हैं कि आपके पास एक टारबॉल है जिसे lotsofdata.tar.gzआप जानते हैं और आपको बस एक फाइल है जिसमें आप चाहते हैं, लेकिन आप सभी को याद रख सकते हैं कि इसके नाम में शब्द है contract। आपके पास दो विकल्प हैं:

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

विकल्प 1

$ tar -tzf lotsofdata.tar.gz | grep contract

यह उन सभी फाइलों का विवरण सूचीबद्ध करेगा जिनके नाम में आपका ज्ञात भाग है। फिर आप जो उपयोग करना चाहते हैं उसे निकालें:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

./काम करने के लिए आपको अपने रास्ते के सामने की आवश्यकता हो सकती है ।

विकल्प 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

आपके ऊपर जो आपको आसान या सबसे उपयोगी लगता है।


Drat। उस अंतिम कमांड पर एक टाइपो: मैंने डुप्लिकेट किया -xzf। उन स्विच का केवल एक उदाहरण होना चाहिए।
वेंडी क्रिक

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>मेरे लिए ./पूर्ण पथ की शुरुआत में साथ देने के लिए काम किया
user13107

आपको इनसे धैर्य रखना पड़ सकता है, इसमें कुछ समय लगा ... इसके अलावा शायद यह स्पष्ट है, लेकिन यह वर्तमान निर्देशिका में पूर्ण निर्देशिका संरचना को निकालने जा रहा है, भले ही वे निर्देशिका अभी तक मौजूद न हों।
पीजे ब्रुनेट

BSD टार (कम से कम macOS पर) --wildcardsविकल्प का समर्थन नहीं करता है। मैं अभी भी उसी तरह का व्यवहार करने में सक्षम था -x -O *foo*fooमेरे मामले में फ़ाइल नाम ग्लोब था, क्योंकि मुझे पता था कि फ़ाइल फू के साथ समाप्त हो गई है।
एरिक हू

6

मैं दूसरे दिन हजारों फाइलों के साथ एक टारबॉल से कुछ सौ फाइलें निकालने की कोशिश कर रहा था। मुझे जिन फ़ाइलों की आवश्यकता है, उन्हें एक भी वाइल्डकार्ड द्वारा संदर्भित नहीं किया जा सकता है। इसलिए मैंने गुगली की और यह पृष्ठ पाया।

हालाँकि, ऊपर दी गई कोई भी ट्रिक मेरे काम के लिए अच्छी नहीं लगती। मैंने उस आदमी को पढ़ना समाप्त कर दिया, और यह विकल्प पाया --files-from, इसलिए मेरा अंतिम समाधान है

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

और यह एक आकर्षण की तरह काम करता है।

अपडेट: सूची फ़ाइल में वही प्रारूप होना चाहिए जैसा कि आप देखेंगे tar -tvf, अन्यथा आप किसी भी फाइल को निकालने में सक्षम नहीं होंगे।


2

यदि आप ब्रेसिज़ को छोड़ते हैं तो आपका उदाहरण मेरे लिए काम करता है

$ tar --extract --file=test.tar.gz extract11

यदि आपकी फ़ाइल extract11 एक सबफ़ोल्डर में है, तो आपको टारबॉल के भीतर पथ निर्दिष्ट करना चाहिए।

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
अंकित वशिष्ठ

तब obantly extract11 टार-फाइल में नहीं है। सुनिश्चित करें कि आपको सापेक्ष पथ प्रदान करने की आवश्यकता है। संपादित देखें
बर्नहार्ड

1

कृपया tar.gz फ़ाइल से विशिष्ट फ़ाइलों को निकालने के उदाहरणों के नीचे देखें।

स्थानीय फ़ाइल से:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

दूरस्थ URL से:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.