निर्देशिका का चयन कैसे करें


124

मान लें कि मेरे पास फ़ाइल नाम है ugly_name.tar, जिसे निकालने पर ugly_nameनिर्देशिका बन जाती है । मैं किस कमांड का उपयोग कर सकता हूं जिसके परिणामस्वरूप निर्देशिका का नाम pretty_nameइसके बजाय है?

जवाबों:


171

यह काम करना चाहिए:

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

मुझे लगता है कि मैं गूंगा संस्करण के साथ
रहूँगा

28
@phunehehe: स्मार्ट वर्जन का एक फायदा यह है कि आपको पहले से पता नहीं होना चाहिए कि अनारक्षित डायरेक्टरी का नाम क्या है
tshepang

2
क्या मैं जोड़ सकता हूं, कि यह "Pretty_name" से अधिक के लिए काम करता है। आप इस तरह एक विशिष्ट निर्देशिका के लिए भी अनटार कर सकते हैं। उदाहरण:tar -xvf /tmp/backupfiles.tar -C /var/www/
जनरल रेडनेक

2
मैं आमतौर पर गूंगे तरीके का उपयोग करता हूं, और मैं वाइल्डकार्ड का उपयोग करता हूं अगर मुझे पता नहीं है कि बदसूरत नाम क्या होगा या मैं इसे लिखना नहीं चाहता हूं। mv ugly-* pretty_name
डेविड ग्रेसन

1
यदि कोई ugly_nameनिर्देशिका पहले से है, तो डंबल तरीका काम नहीं करता है । वैसे, सुंदरता देखने वाले की आंखों में है।
किमीकिला

30

साथ जीएनयू टार ≥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!'

paxPOSIX संग्रह उपयोगिता के साथ , -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!'

9

इसे इस्तेमाल करो :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
आप &&उन दो आदेशों के बीच सूची ऑपरेटर का उपयोग करना पसंद कर सकते हैं , इसलिए दूसरा तभी निष्पादित होगा जब पहले वाला सफल हुआ हो।
मैनटवर्क

1
यदि कोई निर्देशिका ugly_nameपहले से मौजूद है, तो इसके अवांछनीय परिणाम हो सकते हैं ।
ड्रू डॉर्मन

7

सबसे सरल तरीका

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

(1) यह स्पष्ट रूप से सबसे सरल तरीका नहीं है, क्योंकि smac89 ने--one-top-level=pretty_name बिना किसी विशेषता के उत्तर पोस्ट किया है--strip-components 1 । (2) इसके विपरीत, स्वीकृत उत्तर (मैट द्वारा पोस्ट) के--strip-components 1 बिना सुविधाएँ --one-top-level=pretty_name। (३) क्या आप बता सकते हैं कि इन विकल्पों को मिलाकर आपका उत्तर, पुराने किसी भी विकल्प से बेहतर क्यों है? कृपया टिप्पणियों में प्रतिक्रिया न दें;  इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
जी-मैन

शायद एक वास्तविक उदाहरण आपको स्पष्ट करने में मदद कर सकता है: `wget dev.mysql.com/get/Downloads/MySQL-5.7//… tar xvf mysql-5.7.23-linux-glibc2.12-x86-64.tar.gz --one-top -वेल = mysql57 --स्ट्रिप-घटक 1 `
marquicus

यह उत्तर सबसे अधिक उत्थान के साथ एक से अधिक सुरुचिपूर्ण है ।
कैसरकत्जे

@ जी-मैन --strip-component 1की आवश्यकता होती है किसी के साथ, mkdirया --strip-components 1, विधि अन्यथा तुम सिर्फ पाने के pretty_name/ugly_name/
द्रविड़

यह वास्तव में सबसे आसान तरीका है
smac89

2

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/
द्रविड़

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