जवाबों:
यह काम करना चाहिए:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
अनपैकिंग (या पैकिंग) से पहले निर्दिष्ट निर्देशिका में परिवर्तन। --strip-components
संग्रह में संग्रहीत फ़ाइल नाम से निर्देशिकाओं की निर्दिष्ट संख्या निकालता है।
ध्यान दें कि यह वास्तव में पोर्टेबल नहीं है। GNU टार और कम से कम कुछ BSD टार का --strip-components
विकल्प है, लेकिन अन्य यूनिक्स जैसे प्लेटफार्मों पर मौजूद नहीं है।
ऐसा करने का गूंगा तरीका हालांकि हर जगह बहुत काम करेगा।
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
निर्देशिका पहले से है, तो डंबल तरीका काम नहीं करता है । वैसे, सुंदरता देखने वाले की आंखों में है।
साथ जीएनयू टार ≥1.16, का उपयोग --transform
(परिवर्तन संग्रह में पूरा पथ पर लागू किया जाता है) प्रत्येक फ़ाइल नाम के लिए एक sed regexp परिवर्तन लागू करने के लिए:
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
यदि ugly_name
संग्रह में सभी फ़ाइल नामों का सबसे बड़ा घटक है, तो आपको सटीक मिलान से परेशान होने की आवश्यकता नहीं है:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
यदि आप टॉपवेल निर्देशिका का नाम नहीं जानते हैं, तो भी आप इस पद्धति का उपयोग कर सकते हैं, हालाँकि आप --strip-components
इसके बजाय पसंद कर सकते हैं ।
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
pax
POSIX संग्रह उपयोगिता के साथ , -s
विकल्प का उपयोग करें , जो एक तर्क के रूप में एक sed जैसी प्रतिस्थापन अभिव्यक्ति लेता है।
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
इसे इस्तेमाल करो :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
उन दो आदेशों के बीच सूची ऑपरेटर का उपयोग करना पसंद कर सकते हैं , इसलिए दूसरा तभी निष्पादित होगा जब पहले वाला सफल हुआ हो।
ugly_name
पहले से मौजूद है, तो इसके अवांछनीय परिणाम हो सकते हैं ।
सबसे सरल तरीका
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
बिना किसी विशेषता के उत्तर पोस्ट किया है--strip-components 1
। (2) इसके विपरीत, स्वीकृत उत्तर (मैट द्वारा पोस्ट) के--strip-components 1
बिना सुविधाएँ --one-top-level=pretty_name
। (३) क्या आप बता सकते हैं कि इन विकल्पों को मिलाकर आपका उत्तर, पुराने किसी भी विकल्प से बेहतर क्यों है? कृपया टिप्पणियों में प्रतिक्रिया न दें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
--strip-component 1
की आवश्यकता होती है किसी के साथ, mkdir
या --strip-components 1
, विधि अन्यथा तुम सिर्फ पाने के pretty_name/ugly_name/
।
AskUbuntu से, इस जवाब ने मेरे लिए काम किया:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--एक-उच्च-स्तरीय [= dir] '
टार को निष्कर्षण निर्देशिका के नीचे एक नई निर्देशिका बनाने के लिए कहता है (या `-सी 'में उत्तीर्ण होता है) और इसका उपयोग टार्बोम्स के विरुद्ध सुरक्षा के लिए करता है। डीआईआर तर्क की अनुपस्थिति में, नई निर्देशिका का नाम संग्रह के आधार नाम के बराबर होगा (फ़ाइल नाम माइनस प्रत्यय, अगर मान्यता प्राप्त है)। कोई भी सदस्य नाम जो उस निर्देशिका के नाम से शुरू नहीं होता है (`- ट्रान्सफॉर्म से रूपांतरण के बाद 'और' --स्ट्रिप-घटक ') इसके साथ उपसर्ग किया जाएगा। मान्यता प्राप्त फ़ाइल नाम प्रत्यय `.tar 'हैं, और कोई भी संपीड़न See -auto-compress द्वारा पहचाने जाने योग्य है ।
जैसा कि टिप्पणियों में बताया गया है , यह विधि उन अभिलेखागार के लिए काम नहीं करती है जो ठीक से बनते हैं, हालांकि एक अन्य उत्तर से पता चलता है, आपको इसे --strip-components 1
वास्तव में काम करने के लिए जोड़ना चाहिए । मैंने इस नए विकल्प के साथ परीक्षण किया है और यह शीर्ष स्तर के नाम और बिना वाले अभिलेखागार दोनों के लिए काम करता है।
pretty_name
, उसके बाद मूल शीर्ष-स्तरीय निर्देशिका के साथ है। उदाहरण के लिए, यदि tar xzf ugly_name.tgz
एक निर्देशिका बनाई जाएगी ugly_name/
, तो आपके द्वारा प्रदान की गई कमांड बनाएगी pretty_name/ugly_name/
।