विशाल tgz फ़ाइल से एकल फ़ाइल निकालें


19

मेरे पास एक बहुत बड़ी टार फाइल है (लगभग 500G) और मैं इसमें से सिर्फ एक फाइल निकालने के लिए तैयार नहीं हूं।
हालाँकि, जब मैं tar -xvf file.tgz path/to/fileइसे चलाता हूं तो ऐसा लगता है कि यह अभी भी पूरी सामग्री को मेमोरी में लोड कर रहा है, और निकालने में एक घंटे से अधिक समय लगता है। मैंने यह भी प्रयोग करने की कोशिश की है --exclude=ignore.txtकि इसे कहां पर अनदेखा किया जाए। इसे किसी भी तरह से बेकार रास्ते से रोकने के प्रयास में पैटर्न की सूची है, लेकिन यह काम नहीं करता है।

शायद मुझे समझ में नहीं आ रहा है ... फ़ाइल को जल्दी से निकालने का कोई तरीका है?


मैं उसी के बारे में सोच रहा हूं। जिस फ़ाइल को मैं देख रहा हूँ, वह जल्दी से मिल जाती है और निकाली जाती है - और फिर मुझे प्राप्त होने के लिए एक घंटे के लिए प्रतीक्षा करने की आवश्यकता होती है: o (
maasha

जवाबों:


14

दुर्भाग्य से, .tar.gzसंग्रह के एकल सदस्य को अनपैक करने के लिए आपको पूरे संग्रह को संसाधित करना होगा, और इसे ठीक करने के लिए आप बहुत कुछ नहीं कर सकते।

यह वह जगह है जहां .zip(और कुछ अन्य प्रारूप जैसे .rar) अभिलेखागार बेहतर तरीके से काम करते हैं, क्योंकि zipप्रारूप में सभी फाइलों की केंद्रीय निर्देशिका होती है zip, जिसमें फ़ाइल के मध्य की ओर इशारा करते हुए प्रत्यक्ष ऑफ़सेट्स होते हैं , इसलिए संग्रह के सदस्यों को पूरी चीज़ को संसाधित किए बिना जल्दी से निकाला जा सकता है।

आप पूछ सकते हैं कि प्रसंस्करण .tar.gzइतना धीमा क्यों है?

.tar.gz(अक्सर के रूप में छोटा .tgz) .tarकंप्रेसर के साथ gzipसंपीड़ित बस संग्रह है । gzipस्ट्रीमिंग कंप्रेसर है जो केवल एक फ़ाइल के साथ काम कर सकता है। यदि आप gzipस्ट्रीम का कोई भी भाग प्राप्त करना चाहते हैं , तो आपको इसे पूरी तरह से अनकैप्ड करना होगा और यही वह है जो वास्तव में .tar.gz(और इसके लिए .tar.bz2, .tar.xzऔर इसी तरह के अन्य स्वरूपों के आधार पर .tar) को मारता है ।

.tarप्रारूप वास्तव में बहुत, बहुत सरल है। यह केवल 512-बाइट फ़ाइल या निर्देशिका हेडर (नाम, आकार, आदि) की धारा है, प्रत्येक फ़ाइल या निर्देशिका सामग्री (यदि आवश्यक हो तो 0 बाइट्स के साथ 512 ब्लॉक आकार के लिए गद्देदार)। जब आप किसी शीर्ष लेख के लिए पूरी तरह से रिक्त 512 ब्लॉक का निरीक्षण करते हैं, तो इसका मतलब .tarसंग्रह का अंत है ।

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


3
gzip असम्पीडित डेटा को स्ट्रीम कर सकता है, यह पूरी बात को पूर्ववत करने के लिए नहीं है। लेकिन, चूंकि टेप संग्रह के लिए .tar कम है, आपको पूरी फ़ाइल को तब तक ट्रैस करने की आवश्यकता है जब तक आपको वह फ़ाइल नहीं मिल जाती है जिसे आप खोज रहे हैं। हालांकि टार दिखते रहेंगे क्योंकि कोई अन्य हो सकता है, बाद में टार फ़ाइल में बाद में कॉपी कर सकता है।
कुर्टम

9

यदि आप बड़ी टार फ़ाइल से सिर्फ एक फ़ाइल निकाल रहे हैं, तो आप GNU का उपयोग कर रहे हैं tar, और आप यह गारंटी दे सकते हैं कि टार फ़ाइल को कभी जोड़ा नहीं गया है, तो आप उपयोग करके एक महत्वपूर्ण प्रदर्शन को बढ़ावा दे सकते हैं --occurrence

जैसे ही यह आपके द्वारा अनुरोधित प्रत्येक फ़ाइल की पहली घटना का पता लगाता है, वैसे ही यह विकल्प टार को बताता है

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

पूरे टारबॉल के माध्यम से स्पूल नहीं करेगा क्योंकि यह प्रत्येक की एक प्रति पाता है passwdऔर shadow, इसके बजाय यह बंद हो जाएगा। यदि वे फाइलें अंत में प्रदर्शन के पास पहुंचती हैं, तो प्रदर्शन अधिक नहीं होगा, लेकिन यदि वे 500 जी फाइल के माध्यम से आधे रास्ते में भी दिखाई देते हैं, तो आप बहुत समय बचा लेंगे।

tarएकल शॉट बैकअप के लिए उपयोग करने वाले लोग और वास्तविक टेप ड्राइव का उपयोग नहीं करने के लिए यह स्थिति शायद विशिष्ट मामला है।

ध्यान दें कि आप --occurrence=NUMBERप्रत्येक फ़ाइल की गणना घटना को पुनः प्राप्त करने के लिए भी पास हो सकते हैं , जो यदि आपको पता है कि संग्रह में कई संस्करण हैं, तो यह मदद करता है । डिफ़ॉल्ट रूप से व्यवहार NUMBER1 के बराबर है ।


क्या टार बनाने का कोई तरीका है ताकि एक विशिष्ट फ़ाइल पहले सामने आए? इतना है कि --occurrenceपहली फ़ाइल में तुरंत किक करेंगे? मुझे लगता है कि यह फ़ाइल नाम के बारे में है, इसलिए aaaa.jpg नाम की कोई चीज़ उदाहरण के लिए पहले आएगी?
जेफ

1
@ जेफ़: वास्तव में नहीं। यह महज tarएक फ़ाइल के नए संस्करणों के लिए टारबॉल को खोजने के लिए जारी रखने से रोकता है। इसके बजाय यह देता है, के रूप में आदमी पेज का कहना है, the Nth occurrence। यदि आप कमांड लाइन पर निकालने के लिए एक फ़ाइल निर्दिष्ट करते हैं और आप कहते हैं कि --occurrenceटार तब तक बाहर निकल जाएगा जैसे ही उस फ़ाइल को मिल गया है, और इस तरह प्रभावी रूप से "पहली फ़ाइल" पर बंद हो जाएगा।
फोगग

2

एक बड़े टारबॉल उपयोग के साथ काम करते समय:

--fast-readकेवल पहली संग्रह प्रविष्टि निकालने के लिए जो फ़ाइल नाम ऑपरेंड से मेल खाती है, path/to/fileइस मामले में - जो वैसे भी टारबॉल में हमेशा अद्वितीय है

tar -xvf file.tgz --fast-read path/to/file

ऊपर जब तक यह एक मैच पाता है और तब बाहर निकलेगा तब तक खोज करेगा


1
मैं समझना चाहता था कि यह अभी भी 0 अंक पर क्यों है। man tar(GNU tar 1.29) इस विकल्प को प्रिंट भी नहीं करता है। हालाँकि उबंटू को लगता है कि यह डिफ़ॉल्ट रूप से सक्षम है । जल्दी से पढ़ना, मुझे यकीन नहीं है कि --fast-readइससे अलग क्या होता है --occurrence। लेकिन तब --occurrenceउबंटू पेज पर भी नहीं है, लेकिन यह अंदर है man tar। कर रहे हैं --fast-readऔर --occurrenceएक ही बात संभवतः?
जेफ

इन विकल्पों में से कोई भी मानक द्वारा निर्दिष्ट नहीं किया जाता है और, हमेशा की तरह गैर-मानक विकल्पों के साथ, इस बात का ध्यान रखा जाना चाहिए कि आपके सिस्टम की उपयोगिता उनका समर्थन करती है। --Occurrences विकल्प GNU टार द्वारा समर्थित है। Thefast- रीड ऑप्शन फ्रीबीएसडी टार के हालिया संस्करणों द्वारा समर्थित है, जिसे उबंटू द्वारा bsdtar के रूप में पैक किया गया है। अधिक के लिए यहाँ देखें ।
फॉगिंग

1

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

तो, आपको शायद इंतजार करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.