इसे निकाले बिना एक टार आर्काइव के रास्तों को बदल दें


10

जीएनयू के tar(1)पास एक स्वच्छ विकल्प है --transform। मैन पेज से:

--transform, --xform विस्तार
फ़ाइल नाम को बदलने के लिए EXPRESSION की जगह sed का उपयोग करें

यह मक्खी पर पथ नामों के परिवर्तन की अनुमति देता है क्योंकि संग्रह को निकाला जा रहा है ताकि आप यह नियंत्रित कर सकें कि इसे कहाँ और कैसे निकाला जाएगा।

मेरा सवाल है, क्या सीटू में एक समान परिवर्तन करने का एक तरीका है ; यानी, बिना आर्काइव निकाले?

उदाहरण

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

उदाहरण

मैं tarमूल रूप से अंत उपयोगकर्ताओं के साथ संघर्ष करने के लिए एक संग्रह वितरित कर रहा हूं और यह चाहूंगा कि यह मेरे से हस्तक्षेप किए बिना सही रास्ते पर आ जाए। मैं संग्रह को निकालने, निर्देशिकाओं का नाम बदलने और संग्रह के रूप में दोहराए जाने के तुच्छ समाधान से बचने की कोशिश कर रहा हूं।


इसे बनाते समय आप नाम क्यों नहीं बदलते?
जोस लुइस मार्टिन

@JoseLuisMartin राइट। मेरा उपयोग मामला यह है कि संग्रह पहले से ही है और, जैसा कि मैंने कहा, मैं अनपैकिंग, ट्रांसफ़ॉर्मिंग और रिपैकिंग से बचना चाहूंगा।
जोसेफ आर।

1
आप वास्तव में डिस्क को निकाले बिना टार स्ट्रीम को संशोधित कर सकते हैं: github.com/mafintosh/tar-stream#modifying-existing-tarballs , perldoc.perl.org/5.10.1/Archive/Tar.html , आदि
vladr

जवाबों:


3

आप आर्कमाउंट या माउंटवॉफ़्ट के साथ संग्रह को माउंट कर सकते हैं और इसे फिर से बना सकते हैं

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

संग्रह फाइलसिस्टम पर लिखने का संचालन ओम्ाउंट पर एक पूर्ण पुनर्लेखन करेगा, इसलिए बड़ी फ़ाइलों के लिए एक अच्छा विकल्प नहीं लगता है।

संपादित करें

मैं कार्यान्वयन विवरण नहीं जानता, लेकिन ऐसा लगता है कि हम फाइल फाइलों को फाइलसिस्टम स्टेप में सहेज रहे हैं।

बस दोस्तों को हल करने के लिए परीक्षण करें, (मेरे / usr के एक टार पर)

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

आउटपुट:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

तो अवाफ्स जीत गए!


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