एक ही आधार नाम के साथ निर्देशिका में टार निकालने?


18

मेरे पास एक ziped फ़ाइल है जैसे myArchive123.tar.gz। इसके अंदर एक फ़ोल्डर होता है जैसेhelloWorld

अगर मैं इसे निकालता हूं: tar -xf myArchive123.tar.gzमुझे helloWorldफ़ोल्डर मिलता है :

ls 
myArchive123.tar.gz
helloWorld 

मैं आउटपुट को फ़ाइल नाम माइनस .tar.gz एक्सटेंशन के समान नाम होना चाहूंगा। अर्थात:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

क्या यह किया जा सकता है?

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

EDIT
इस बीच मैंने अपने आप को एक स्क्रिप्ट को हैक कर लिया जो लगता है कि काम पूरा हो गया। (नीचे मेरा पोस्ट किया गया जवाब देखें)। यदि इसमें सुधार किया जा सकता है, तो कृपया टिप्पणी / अतिरिक्त उत्तर पोस्ट करने के लिए स्वतंत्र महसूस करें। मुख्य बात यह है कि इसे एक-लाइनर की तरह पैक किया जाना चाहिए:

extract <file>

1
क्या आर्काइव में हमेशा एक फ़ोल्डर होता है?
मार्क प्लॉटनिक


मुझे नहीं पता कि निष्कर्षण समय पर इसके अंदर क्या है। यह संग्रह के अंदर क्या है, इस पर निर्भर नहीं होना चाहिए। यदि यह एक फ़ोल्डर है, तो वहां फ़ोल्डर निकालें। अगर यह एक फाइल है, तो सभी फाइलें निकालें।
सिंह उफिम्त्सेव

इस बीच मैंने एक स्क्रिप्ट (नीचे देखें) को एक साथ जोड़ दिया। मैं केवल 2 दिनों में उत्तर स्वीकार कर सकता हूं।
सिंह उफिम्त्सेव

क्या संग्रह में कभी भी शीर्ष स्तर पर एक से अधिक फ़ोल्डर होंगे?
मार्क प्लॉटनिक

जवाबों:


10

इसके साथ gnu tar, आप प्रत्येक फ़ाइल के नाम को प्रस्तुत करने के लिए --xform(या --transform) का उपयोग कर सकते हैं /prefix/:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

ध्यान दें कि फ़ाइल नाम परिवर्तनों से प्रतीकात्मक लिंक लक्ष्यों को बाहर करने के लिए कोई अग्रणी नहीं /है prefix/और sedअभिव्यक्ति समाप्त होती है S
इसका परीक्षण करने के लिए (ड्राई-रन):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

आपको आरंभ करने के लिए, यहाँ एक बहुत ही सरल लिपि दी गई है, जिसे आप इस रूप में लिख सकते हैं extract <file>:

STRIP = $ {1%। *} #Strip अंतिम प्रत्यय
NAME = $ {STRIP% .tar} #strip .tar प्रत्यय, यदि मौजूद हो
tar -xf "$ 1" - xform = "s | ^ | $ NAME / | S" #run कमांड

यह वह चीज है जो मैं चाहता हूं, अपवाद के साथ कि मैं इसे किसी चीज़ में पैकेज करने में सक्षम होना चाहूंगा जैसे: एक्सट्रेक्ट <फ़ाइल>
लियो यूफिमेटसेव

यह छोटी गाड़ी है, यह पहली डॉट पर रुकती है। उदाहरण के लिए मेरे पास एक फाइल है: ग्रहण-एसडीके-4.5 एम 6-लाइनक्स-गेडक-एक्स 86_64.tar.gz। मुझे आउटपुट .tar.gz के बिना आउटपुट की उम्मीद है, लेकिन मुझे ग्रहण- sdk-4
लियो यूफिमेटसेव

ऊपर की स्क्रिप्ट में मैं एक्सटेंशन को स्ट्रिप करता हूं और अगर मैं 'टार' पाता हूं तो इसे और स्ट्रिप कर देता हूं।
सिंह उफिम्त्सेव

सामान्य तौर पर, कई प्रकार के अभिलेखागार के साथ। मैं एक त्वरित लाइनर की उम्मीद कर रहा था, मुझे लगा कि शायद मुझे कुछ तर्क ध्वज याद आ रहा है। लेकिन ऐसा लगता है कि इसका कोई तुच्छ समाधान नहीं है?
सिंह उफिम्त्सेव

अच्छी चीज़। यह काम करता है और मेरे द्वारा लिखी गई स्क्रिप्ट से छोटा है। अच्छा!
सिंह उफिम्त्सेव

7

ठीक है, आप इसे कम से कम कुछ चरणों में कर सकते हैं। अगर तुमने किया

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

यह कार्य पूरा करेगा, हालांकि अभी तक एक और कॉम्पैक्ट उत्तर हो सकता है।


3

संपादित करें

स्वीकृत उत्तर नीचे से छोटा है। (एक ही बात करते हैं, लेकिन छोटी आमतौर पर बेहतर है)।


मैंने अंततः हाथ में टास्क के लिए खुद एक स्क्रिप्ट हैक कर ली। यह .tar.gt और .gz के साथ काम करता है

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

उपयोग:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

ध्यान दें, यह समाधान एक फ़ाइल नाम में डॉट्स में सक्षम है। उदा। ग्रहण -४.५ एम-एसडीके .टीआरजी।

मैं स्क्रिप्ट को अपने गिट रेपो में रखता हूं। नवीनतम संस्करण के लिए, देखें: https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

एक और संभव समाधान --transformविकल्प का उपयोग कर रहा है:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

आपकी फ़ाइलों के साथ:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
लेकिन यह पूर्व-दमन करता है कि आप जानते हैं कि संग्रह के अंदर क्या है
लियो उफिम्त्सेव

जैसे कि संग्रह के अंदर क्या है, यह जाने बिना मैं इसे एक-पंक्ति की स्क्रिप्ट में कैसे बदलूंगा?
सिंह उफिम्त्सेव

तुम सही हो। जैसा कि मैंने यहां लिखा है, यह केवल एक संभव समाधान है ...
svq

क्या उस और --स्ट्रिप-कंपोनेंट्स = 0 myArchive123 में कोई अंतर है?
सिंह उफिम्त्सेव

1
और --strip-components=0बस पथ से पहला निर्देशिका नाम हटाता है और -Cविकल्प के साथ नई निर्देशिका में फ़ाइलों को संग्रहीत करता है।
svq 23/15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.