टार - निर्देशिका संरचना को त्यागने को निकालें


34

unzipएक निफ्टी विकल्प है -j, जिससे आर्काइव की डायरेक्टरी संरचना को छोड़ दिया जाता है, और सभी फाइलों को एक ही डायरेक्टरी में निकाला जाता है।

क्या tarउसी तरह से काम करने का एक तरीका है? मैन पेज में कुछ भी ऐसा नहीं लगता है।

तो, क्या कोई विकल्प, अधिमानतः मुफ्त सॉफ्टवेयर, उपकरण है जो ऐसा करेगा?


जवाबों:


79

जीएनयू टार, फाइटुरिटिस पर रहता है, इसलिए स्वाभाविक रूप से उसके लिए कुछ विकल्प भी हैं।
http://www.gnu.org/software/tar/manual/html_node/transform.html

यदि आप कुछ पथ खंडों को हटाना चाहते हैं, तो --strip-components=nया --strip=nअक्सर करेंगे:

 tar xvzf tgz --strip=1

लेकिन यह भी संभव है कि फ़ाइलों को फिर से लिखना-फिर से लिखना (झंडे लगाना --transformया मॉडिफ़ायर के --xformसाथ /xereg को स्वीकार करना ):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

टार को सूचीबद्ध करने के लिए आपको अतिरिक्त --show-transformedविकल्प की आवश्यकता है :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

मेरा मानना ​​है कि पुनर्लेखन के विकल्प पैकिंग के लिए भी काम करते हैं, न कि केवल निकालने के लिए। लेकिन paxस्पष्ट रूप से एक अच्छा वाक्यविन्यास है।


4
क्यों नहीं s#.*/##?
l0b0

3
-स्ट्रिप सिर्फ मेरा दिन बना। धन्यवाद!
सैमस्टफेन्स

--stripओएस एक्स टार मैन पेज में उल्लेख नहीं किया गया है, लेकिन यह वैसे भी काम करता है, धन्यवाद!
स्लफ

3
स्वीकृत उत्तर की तुलना में बेहतर है।
क्लेटु वॉन श्लेकर

वहाँ के बीच कोई अंतर है --stripऔर --strip-components?
जोएल बर्कले

13

आप इसे दो चरणों में आसानी से कर सकते हैं। आवश्यकतानुसार एडाप्ट करें:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

यह है कि मैं इसे कैसे करूँगा ( find -exec mv -iइसके बजाय का उपयोग करके find | xargs) .... सरल कदम मैं किसी भी प्रणाली को बिना स्क्रिप्ट के चारों ओर ले जाने के लिए दोहरा सकता हूं।
क्वैक क्वोटोटे

1
+1, tmpdir=$( mktemp -d )अस्थायी निर्देशिका बनाते समय काम
आता है

8

pax कर सकते है:

pax -v -r -s '/.*\///p' < archive.tar

या

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

आप -rविकल्प को छोड़ कर पहले नाम प्रतिस्थापन ऑपरेशन की जांच कर सकते हैं ।


1

एक संभावित समाधान जिसे कुछ भी स्थापित करने की आवश्यकता नहीं है।

  1. tar tvfटारबॉल से सभी फ़ाइलों को हथियाने के लिए a का उपयोग करें
  2. उन फ़ाइलों को व्यक्तिगत रूप से निकालें - स्टडआउट के लिए टार एक्सट्रैक्ट है और $ फ़ाइल नाम पर पुनर्निर्देशित करें

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

extract.sh के रूप में सहेजें और के रूप में चलाएँ extract.sh myfile.tar। यह टारबॉल से खींची गई निर्देशिकाओं में सामना किए गए किसी भी डुप्लिकेट फ़ाइलनाम को भी अधिलेखित करेगा।


वास्तव में मैंने अभी इसे घर पर कुछ दिर के पेड़ पर परीक्षण किया और यह रिक्त स्थान वाली फाइलों पर विफल रहता है। मैं देखूंगा कि क्या मैं अपडेट पोस्ट नहीं कर सकता।
डेवपरिलो

इसे ठीक किया, लेकिन यह लगभग उतना सुंदर नहीं था जितना कि यह था।
डेवपरिलो

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

-Oविकल्प मानक बाहर करने के लिए एक फ़ाइल निकालता है, और >एक फ़ाइल में रीडायरेक्ट कि उत्पादन। इसलिए मेरे उदाहरण में मैं foo.mp3 निकाल रहा हूं और इसे bar.mp3 में रीडायरेक्ट कर रहा हूं। फ़ाइल नाम मनमाने हैं।

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