टार आर्काइव से फाइलें निकालें


18

मेरे पास एक बड़ी फाइल foo.tar.xzहै जिसमें बहुत सारी (200000) फाइलें हैं। मुझे लगा कि इस संग्रह में कुछ (लगभग 5000) फाइलें हैं जो मैं नहीं चाहता। मेरे पास अपनी डिस्क पर पूरी चीज़ को डिकम्प्रेस करने के लिए पर्याप्त डिस्क स्थान नहीं है; इसके अतिरिक्त, मुझे डर है कि अगर मैं ऐसा करता हूं तो अधिकार / अधिकार खो सकता है। हालांकि मेरे पास संपीड़ित संग्रह की दो प्रतियों की मेजबानी करने के लिए पर्याप्त स्थान है । क्या संग्रह से फ़ाइलों को हटाने के लिए एक उपकरण है (फ़ाइनल पर रेगेक्स के साथ निर्दिष्ट) ऑन-द-फ्लाई, अर्थात व्यक्तिगत फ़ाइलों में संग्रह को अनपैक किए बिना?

जवाबों:


17

GNU टार में एक --deleteविकल्प है जो आजकल अभिलेखागार के साथ भी काम करता है।

उदाहरण के लिए इसका उपयोग इस तरह करें:

tar -vf yourArchive.tar --delete your/path/to/delete

खबरदार: यह संभवतः किसी भी प्रकार के चुंबकीय टेप माध्यम पर काम नहीं करेगा । लेकिन tarपाइप में काम करने में कोई समस्या नहीं है, इसलिए आप केवल एक अस्थायी टार फाइल का उपयोग कर सकते हैं और बाद में उस टेप को ओवरराइट कर सकते हैं। यह संपीड़ित फ़ाइलों पर भी काम नहीं करेगा, इसलिए आपको फ़ाइल को खोलना होगा।

इसके अलावा, टार अभिलेखागार की पैक की गई रैखिक प्रकृति (डिजाइन द्वारा) के कारण ऑपरेशन किसी भी मामले में धीमा होगा।


1
यह मौजूद है, लेकिन यह उन फ़ाइलों के साथ काम नहीं करता है, जहाँ रैंडम एक्सेस संभव नहीं है (उदाहरण के लिए अभिलेखागार), लेकिन यह मेरा उपयोग-मामला है।
फ्यूजएक्सएक्सएल

1
दूसरी समस्या यह है कि मैं हटाने के लिए एक पैटर्न निर्दिष्ट नहीं कर सकता। मेरी टिप्पणी पर 2013 से ध्यान दें जहां मैं पहले से ही कमियों को संबोधित करता हूं gtar --delete
फूजएक्सएक्सएल

4
@FUZxxl के -Tसाथ काम करता है --delete, और --wildcardsआपको फ़ाइल नाम के बजाय पैटर्न का उपयोग करने की अनुमति देता है, इसलिए पैटर्न और उपयोग वाली एक अस्थायी फ़ाइल बनाएं unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz। यह एक पूर्ण रेगेक्स नहीं करेगा (यदि आपको इसकी आवश्यकता है, तो बस tar -tमिटाने के लिए फ़ाइल नाम की सूची का उपयोग करें और निर्माण करें ), बस फ़ाइल नाम मिलान पैटर्न।
यादृच्छिक 832

14

(संपादित, जैसा कि मैंने प्रश्न को गलत समझा, जिसे बाद में संपादित भी किया गया था)

सबसे अच्छी बात यह है कि आप पूरी फाइल को एक्सट्रेक्ट, डिलीट और रीकोप्रेस कर सकते हैं।

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

सीधे टैर से फ़ाइलों को हटाना संभव नहीं है।

टार एक धारा है, जो मूल रूप से टेप ड्राइव के लिए अभिप्रेत है, जो यादृच्छिक रूप से अच्छी तरह से काम नहीं करती है - जबकि सिद्धांत रूप में यह एक डिस्क फाइल सिस्टम पर एक छेद को पंच करने के लिए संभव हो सकता है / शेष फाइल को फिर से लिखना, सम्पीडन के साथ बिंदु सबसे ज्यादा लूटा जाता है यदि सभी नहीं संपीड़न विधियाँ उन सामग्रियों पर बहुत अधिक निर्भर करती हैं जो पहले फ़ाइल में आई थीं। ऐसा करने के लिए आपको संपीड़न विधि के साथ-साथ टार फ़ाइल प्रारूप के बारे में बहुत विस्तृत ज्ञान की आवश्यकता होगी। यह एक बिंदु पर जटिलता है कि कोई भी इसके साथ परेशान नहीं करेगा। यह सिर्फ फाइलों को इधर-उधर रखने और उन्हें नजरअंदाज करने के लिए सस्ता है।

यदि आपको इस कार्यक्षमता की आवश्यकता है, तो टार शायद वह नहीं है जो आप चाहते हैं।


उन फ़ाइलों में 35% अभिलेखागार का आकार होता है। आपके द्वारा बताए गए प्रतिबंध केवल तभी लागू होते हैं यदि मैं फ़ाइल को फिर से लिखता हूं , न कि अगर मैं इसे संशोधित करता हूं, जो मैं कर सकता हूं (मेरे पास पैक संग्रह को दो बार सहेजने के लिए पर्याप्त स्थान है )। क्या ऐसा कोई उपकरण है?
फ़ूजज़नल

हो सकता है कि मैंने आपके सवाल को गलत समझा हो। यदि आप सभी के बाद टार को अनपैक करने के लिए तैयार हैं, और इसे वापस कर दें, (बस वास्तव में टैरर्ड फ़ाइलों को बनाने के बिना - यानी, टार पाइप के लिए एक सीधा टार), यह संभव हो सकता है।
फ्रॉस्ट्सचुट्ज़

हाँ, मैं ऐसा कर सकता हूँ। यह सिर्फ इतना है कि फ़ाइलों में uids / gids / विशेषताएँ हैं जिन्हें मुझे संरक्षित करने की आवश्यकता है। इसके अलावा, मेरे पास अनपैक किए गए प्रतिनिधित्व को बचाने के लिए पर्याप्त डिस्क स्थान नहीं है। हालांकि मेरे पास दो पैक अभिलेखागार को बचाने के लिए पर्याप्त जगह है।
फ़ूजक्कल

1
यह कोई समस्या नहीं है। यदि मैं इसे एक पास में कर सकता हूं, तो समय बहुत लंबा नहीं होगा। मैं किसी भी संग्रह प्रारूप की कल्पना नहीं कर सकता जो वास्तव में भंडारण जारी करते समय तेजी से हटाने की अनुमति देता है।
फ़ूजक्कल

1
--wildcardsमदद ... मुझे ./हालांकि पैटर्न की शुरुआत में शामिल होना था ...
गर्ट वैन डेन बर्ग

-4

मैनुअल के अनुसार , आप tarकेवल उन लोगों को निकालने के लिए फ़ाइल नाम की सूची पास कर सकते हैं। उदाहरण के लिए:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

मैं नहीं देखता कि कैसे - कपड़ा मेरी मदद करता है। क्या आप विस्तृत कर सकते हैं? कृपया ध्यान रखें कि मैं संग्रह (या इसके पर्याप्त भागों) को डिस्क पर अनपैक नहीं कर सकता।
फ़ूजक्कल

2
कृपया केवल लिंक पोस्ट न करें: यह एक विकी है - इसके लिए पर्याप्त सामग्री जोड़ें, ताकि लोगों को आपके उत्तर को समझने के लिए पृष्ठ छोड़ने के लिए अनावश्यक हो।
जसोनव्रीयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.