टार में उपसर्ग Prepend


17

मैं वर्तमान में बहुत ही अक्षमता से एक गोले में काम करता हूं:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

मैं चाहता हूं कि सब कुछ $ VERSION नाम की निर्देशिका में समाहित हो जाए - क्या ऐसा करने का कोई तरीका है जो उपरोक्त स्क्रिप्ट में सब कुछ कॉपी किए बिना है?


पहली जगह में इसकी नकल क्यों? क्यों नहीं tar cjf archive.tar.bz2 $MYPATH?
चेवी

2
@ कावेरी ने कहा, वह $ संस्करण को माता-पिता के रूप में आर्काइव में चाहते हैं।
कैंट

ओह, मैं इसे अब देख रहा हूं।
चेवी

जवाबों:


26

GNU संस्करण विकल्प (और इसके उपनाम ) का tarसमर्थन करता है , आप इसे इस तरह उपयोग कर सकते हैं--transform--xform

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

उदाहरण के लिए, यह निर्देशिका ट्री दिया गया है

foo
└── foo.txt

आदेश

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

जैसे एक संग्रह का उत्पादन होगा

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
यह उल्लेखनीय है कि यह दृष्टिकोण प्रतीकात्मक लिंक को तोड़ सकता है। Prepending flags=r;समस्या को हल करती है जैसा कि stackoverflow.com/a/29661783/388803 में बताया गया है ।
ेरेगॉन

एक अनुगामी स्लेश शामिल न करें; जब मैं परिवर्तन में अनुगामी स्लैश डालता हूं, तो मूल उपसर्ग छूट जाता है; उदाहरण के लिए s/^a\//b\//, tar -tअभी भी दिखाता है a/जबकि अन्य सभी फाइलें चल रही हैं b/; मुझे लगता है कि यह खतरनाक है, और मुझे वास्तव में उसी उपसर्ग के साथ किसी अन्य फ़ाइल से बचाने की आवश्यकता नहीं है जो टार फ़ाइल में निर्देशिका नहीं है; इसलिए कोई अनुगामी स्लैश ठीक नहीं है, मैं मन को a/बदलने के मामले को संभालने का सबसे अच्छा तरीका जानता हूं लेकिन aa/अगर यह रूट नोड का भाई-बहन होता है तो नहीं ।
ThorSummoner

15

वर्तमान निर्देशिका को टारगेट करने और उपसर्ग जोड़ने के लिए, इसने मेरे लिए काम किया:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

यदि आप जिस फ़ाइल ट्री पर तार कर रहे हैं, उसके भीतर प्रतीकात्मक लिंक को संरक्षित किए बिना आप दूर जा सकते हैं, तो आप कर सकते हैं

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

hविकल्प का मतलब है सिमलिंक भिन्नता, यानी फ़ाइल या निर्देशिका में शामिल है कि के लिए लिंक अंक नहीं बल्कि बस तथ्य एक सिमलिंक और क्या यह की ओर इशारा किया था कि रिकॉर्डिंग की तुलना में।


0

एक निर्देशिका उपसर्ग आराम से जोड़ने के लिए, तुलना में एक अलग विभाजक का उपयोग /में --transformतर्क, जैसे +या ,एंडी जवाब में की तरह।

तो, एक सरल मामले के लिए, आपके पास वर्तमान निर्देशिका में फ़ाइलों का एक गुच्छा है, और आप एक तारकोल नहीं बनाना चाहते हैं ।

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

वाक्यविन्यास है s+search+replace+, और इसके लिए ^केवल फ़ाइल नाम की शुरुआत से मेल खाता है।

और अब, बस ओपी को जवाब देने के लिए - ठीक है, आप अपनी पूरी निर्देशिका को कॉपी करके इससे बच सकते हैं /tmp:

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

वैकल्पिक रूप से:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(कड़ी से कड़ी, सहानुभूति के साथ समस्याओं से बचा जाता है)

अंतिम दो को मनोरंजन मूल्य के लिए शामिल किया गया था, मैं खुद toro2k के उत्तर पर टिकूंगा।

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