एक निर्देशिका टार, लेकिन संग्रह में पूर्ण निरपेक्ष पथ संग्रहीत नहीं है


277

मेरे पास बैकअप शेल स्क्रिप्ट के भाग में निम्नलिखित कमांड है:

tar -cjf site1.bz2 /var/www/site1/

जब मैं पुरालेख की सामग्री को सूचीबद्ध करता हूं, मुझे मिलता है:

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

लेकिन मैं /var/www/site1निष्कर्षण को आसान बनाने और बेकार निरंतर निर्देशिका संरचना से बचने के लिए, निर्देशिका के भाग को और संग्रह के भीतर नाम दर्ज करना चाहूंगा । कभी नहीं पता, अगर मैं ऐसी वेबसाइट में बैकअप की गई वेबसाइटों को निकालता, जहाँ वेब डेटा को संग्रहीत नहीं किया जाता था /var/www

उपरोक्त उदाहरण के लिए, मैं यह करना चाहूंगा:

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

इसलिए, जब मैं निकालता हूं, तो फ़ाइलों को वर्तमान निर्देशिका में निकाला जाता है और मुझे बाद में निकाली गई फ़ाइलों को स्थानांतरित करने की आवश्यकता नहीं होती है, और इसलिए कि उप-निर्देशिका संरचना संरक्षित होती है।

stackoverflowवेब पर और अन्य स्थानों पर टार और बैकअप के बारे में पहले से ही कई प्रश्न हैं, लेकिन उनमें से अधिकांश पूरे उप-निर्देशिका संरचना (चपटे) को छोड़ने के लिए कहते हैं, या नामों में प्रारंभिक / हटा दें या हटा दें (I don ' टी पता है कि निकालने के दौरान यह वास्तव में क्या बदलता है), लेकिन अब और नहीं।

यहाँ और वहाँ कुछ समाधानों को पढ़ने के बाद मैंने मैनुअल की कोशिश की:

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

लेकिन उनमें से किसी ने भी मेरे इच्छित तरीके से काम नहीं किया। कुछ कुछ नहीं करते हैं, कुछ अन्य अब उप-निर्देशिकाओं को संग्रहीत नहीं करते हैं।

यह एक क्रॉन द्वारा शुरू की गई बैकअप शेल स्क्रिप्ट के अंदर है, इसलिए मुझे अच्छी तरह से पता नहीं है कि कौन सा उपयोगकर्ता इसे चलाता है, पथ और वर्तमान निर्देशिका क्या है, इसलिए हमेशा सब कुछ के लिए निरपेक्ष पथ लिखना आवश्यक है, और वर्तमान निर्देशिका को बदलना पसंद नहीं करेगा स्क्रिप्ट में आगे कुछ तोड़ने से बचने के लिए (क्योंकि यह न केवल बैकअप वेबसाइटों, बल्कि डेटाबेस भी है, फिर सभी को एफ़टीपी आदि भेजें)

इसे कैसे प्राप्त किया जाए?

क्या मुझे सिर्फ गलतफहमी है कि विकल्प -सी कैसे काम करता है?



ठीक है, -Cबस "निर्देशिका बदलें" का मतलब है, जबकि एक पथ (या उपसर्ग) की जगह केवल द्वारा किया जा सकता है --transform। रीफ। superuser.com/questions/595510/prepend-prefix-in-tar/595512 आप सरल -सी (परिवर्तन निर्देशिका) और इसे बदल सकते हैं: `` tar cjf site1.bz2-ransransform "s / ^ \। \" // $ targetbase / "-C / var / www / site1। `` `
Daniele Cruciani

यह एक बहुत अच्छा प्रश्न है और दुख की बात है कि इस तिथि का कोई भी उत्तर संतोषजनक नहीं है। हम अभी तक कुछ बुद्धिमान व्यक्ति से सुनना चाहते हैं कि हम मूल स्थान या निर्देशिका पेड़ के संदर्भ के बिना वर्तमान निर्देशिका में सिर्फ एकल फ़ाइल style.css (उदाहरण के ऊपर) कैसे निकाल सकते हैं? मैं अवांछित नई पेड़ संरचना के साथ अपनी वर्तमान निर्देशिका को अव्यवस्थित नहीं करना चाहता। साल के लिए नजरअंदाज की गई टारबॉल की एक गंभीर कमी की तरह लगता है।
elmclose

जवाबों:


383
tar -cjf site1.tar.bz2 -C /var/www/site1 .

उपरोक्त उदाहरण में, टार /var/www/site1अपनी चीज करने से पहले निर्देशिका में बदल जाएगा क्योंकि विकल्प -C /var/www/site1दिया गया था।

से man tar :

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR

152
अंत में डॉट को याद न करें, यह महत्वपूर्ण है ;-)
स्वतंत्रता

9
कैसे के बारे में अगर आप भी वाइल्डकार्ड के आधार पर बैकअप के लिए फ़ाइलों का चयन करना चाहते हैं? -C / var / www / site1 * .dat काम नहीं करता है :(
एंडी लोरेंज

16
डॉट tarवर्तमान निर्देशिका में सब कुछ संग्रह करने के लिए कहता है। और -Cवर्तमान निर्देशिका सेट करता है।
लार्स ब्रिंकहॉफ

21
यह बहुत अच्छा काम करता है। मुझे निर्देशिका नाम (बस पूर्ण पथ नहीं) को संरक्षित करने के लिए उपयोगी लगता है, इसलिए मैंने निम्नलिखित कार्य किया: tar -czvf site1.tar.gz -C /var/www/ site1(स्थान पर ध्यान दें, मैं अभी भी -C का उपयोग कर रहा हूं, मूल dir को cd करने के लिए, और dir को tar में निर्दिष्ट कर रहा हूं) डॉट की जगह)
jorfus

9
मुझे टार के रास्ते में एक अग्रणी बिंदु मिलता है जैसे ./foldersकि इसे कैसे हटाया जा सकता है?
मिका

39

विकल्प -C काम करता है; सिर्फ स्पष्टीकरण के लिए मैं 2 उदाहरण पोस्ट करूंगा:

  1. पूर्ण पथ के बिना एक टारबॉल का निर्माण: पूर्ण पथ /home/testuser/workspace/project/application.warऔर हम जो चाहते हैं वह सिर्फ project/application.warइतना है:

    tar -cvf output_filename.tar  -C /home/testuser/workspace project

    नोट: के बीच एक जगह है workspaceऔर project; टार बस के साथ पूर्ण पथ की जगह लेगा project

  2. लक्ष्य पथ को बदलने के साथ टारबॉल की निकासी (डिफ़ॉल्ट ., यानी वर्तमान निर्देशिका)

    tar -xvf output_filename.tar -C /home/deploy/

    tarदिए गए पथ के आधार पर टारबॉल निकालेगा और सृजन पथ को संरक्षित करेगा; हमारे उदाहरण में फ़ाइल application.warको निकाला जाएगा /home/deploy/project/application.war

    /home/deploy: अर्क पर दिया
    project: टारबॉल के निर्माण पर दिया

नोट: यदि आप बनाई गई टारबॉल को लक्ष्य निर्देशिका में रखना चाहते हैं, तो आप टारबॉल नाम से पहले लक्ष्य पथ जोड़ें। उदाहरण के लिए:

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project

1
अंतिम उदाहरण में फ़ाइल चयन के लिए वाइल्डकार्ड कैसे जोड़ें?
शिव

वाइल्डकार्ड के साथ समस्या यह है कि शेल उन्हें मेल खाने वाले फ़ाइलनामों में विस्तारित करता है और टार उन्हें विस्तारित नहीं करता है यदि उन्हें उद्धृत किया जाता है ...
गर्ट वैन डेन बर्ग

मैं Ubuntu 18.04 पर यह कोशिश की और कोई भाग्य नहीं। मुझे यकीन नहीं है कि मैं क्या याद कर रहा हूँ। मेरा स्टैडआउट इसे सही ढंग से प्रदर्शित कर रहा है जब मैं इसे पैकेज करता हूं, लेकिन जब मैं इसे अनटार करता हूं, तब भी इसका पूरा रास्ता होता है
sdc

14

लगता है -Cटार v2.8.3 तक विकल्प सभी प्लेटफार्मों (OSes) पर लगातार काम नहीं करता। -Cविकल्प को संग्रह में निर्देशिका जोड़ने के लिए कहा जाता है, लेकिन मैक और उबंटू पर यह उत्पन्न टार्ग के अंदर पूर्ण पथ उपसर्ग जोड़ता है।

tar target_path/file.tar.gz -C source_path/source_dir

इसलिए लगातार और मजबूत समाधान cdsource_path (source_dir की मूल निर्देशिका) और चलाने के लिए है

tar target_path/file.tar.gz source_dir

या

tar -cf target_path/file.tar.gz source_dir

आपकी स्क्रिप्ट में। यह आपके उत्पन्न हुए tar.gz फ़ाइल की निर्देशिका संरचना में पूर्ण पथ उपसर्ग को हटा देगा।


1
-सी ऑप्शन का उपयोग डीआईडी ने उत्पन्न टार के अंदर निरपेक्ष पथ उपसर्गों को हटा दिया। फेडोरा 29 पर फ़ाइल। क्या आपका जवाब कुछ सिस्टम के लिए विशिष्ट है?
EL_DON

@EL_DON: मैंने फेडोरा पर टेस्ट -सी विकल्प का चयन नहीं किया, लेकिन आदर्श रूप से टार एप्लिकेशन सॉफ़्टवेयर को हर प्लेटफ़ॉर्म पर लगातार काम करना चाहिए जब तक कि यह टार एप्लिकेशन में बग न हो। -सी विकल्प, मैंने मैक 10.8 और मैक 10.13 और उबंटू पर परीक्षण किया (संस्करण जो मुझे याद नहीं है)। लेकिन tar v2.8.3 के रूप में, कमांड को tar -cf target_path / file.tar.gz source_dir में बदल दिया गया है और फिर भी यदि आप -C विकल्प जोड़ते हैं, तो यह उत्पन्न हुए tar.gz फ़ाइल के अंदर पूर्ण पथ उपसर्ग नहीं हटाएगा।
चिंचाका सेनानायका

मैंने सेंटोस सिस्टम पर फिर से परीक्षण किया। उदाहरण में सभी पथ बनाने के बाद और कमांड को चलाने के साथ ( -cvfबाद में जोड़ा गया tar), मुझे लगता है कि परिणामी tar.gz फ़ाइल के अंदर पूर्ण पथ नहीं है, जो कई अन्य उत्तरों के अनुरूप है। यदि आपको लगता है कि परीक्षण के लिए मेरे द्वारा उपयोग की गई दोनों प्रणालियों पर टार टूटा या पुराना है, तो कृपया कुछ दस्तावेज़ीकरण से लिंक करें जो आपके उत्तर का समर्थन करेंगे। मुझे लगता है -Cकि निष्पादित करने से पहले विकल्प बदल जाता है (अन्य उत्तरों की तरह)। जब मैं इसे छोड़ देता हूं, तो टार कबाड़ को जोड़ने की कोशिश करता है ./, जिसमें से रास्ते शुरू होते हैं ./
EL_DON

मैंने इस डॉक का उपयोग किया: linux.die.net/man/1/tar हां, डॉक कहता है -सी पथ परिवर्तन करेगा, लेकिन मेरे मैक 10.13 पर यह काम नहीं कर रहा है। यह टार ऐप का एक असंगत व्यवहार हो सकता है। इसका मतलब है कि यह एक बग है। यदि आप सभी यूनिक्स प्लेटफार्मों पर चलने के लिए एक शेल स्क्रिप्ट लिख रहे हैं तो रनिंग कोड के साथ सुरक्षित रहें जो सभी ओएस पर काम करेगा।
चिन्तका सेनानायका

आपका जवाब यह नहीं कहता है कि बग हो सकता है और क्रॉस-प्लेटफॉर्म संगतता के लिए अधिक मजबूत समाधान cdपहले है। आपका उत्तर कहता है कि टूल इस तरीके से काम करता है कि कैसे डॉक्स कहता है कि यह कैसे काम करता है और यह मेरे सिस्टम पर कैसे काम करता है, इसलिए यह गलत उत्तर है। आप इसे आसानी से ठीक कर सकते हैं।
EL_DON

7

निम्नलिखित कमांड एक रूट डायरेक्टरी बनाएगा "।" और इसमें निर्दिष्ट निर्देशिका से सभी फ़ाइलों को डाल दिया।

tar -cjf site1.tar.bz2 -C /var/www/site1 .

यदि आप सभी फ़ाइलों को टार फ़ाइल की जड़ में रखना चाहते हैं, तो @chinthaka सही है। बस निर्देशिका में सीडी और करो:

tar -cjf target_path/file.tar.gz *

यह cwd में सभी फ़ाइलों को रूट फ़ाइलों के रूप में टार फाइल में डाल देगा।


1
* का उपयोग करने से कोई भी "छिपा हुआ" नहीं बचा है। फ़ाइल या फोल्डर। (fyi, -C के साथ मिलकर * विफल रहता है, शेल वर्तमान dir का विस्तार करता है, -C dir का नहीं)
Xen2050

1

"बिंदु" का उपयोग करके "बिंदु" (उबंटू 16 पर) नामक एक फ़ोल्डर का निर्माण होता है।

tar -tf site1.bz2 -C /var/www/site1/ .

मैंने इससे अधिक विस्तार से निपटा और एक उदाहरण तैयार किया। मल्टी-लाइन रिकॉर्डिंग, प्लस एक अपवाद।

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/

आप इसे "बिंदु" क्यों कह रहे हैं? यह सिर्फ है ., जो वर्तमान निर्देशिका है। tar.gzसंरचना के संदर्भ में , यह सिर्फ आधार / जड़ / शीर्ष स्तर है, है ना?
EL_DON

विवरण छवि के लिए स्नैपशॉट देखें । मेरा तरीका उपयोग करने के लिए अधिक सही है, यह मेरी राय है।
सर्गेई असाचेव

0

यदि आप किसी उपनिर्देशिका को संग्रहीत करना चाहते हैं और उपनिर्देशिका को ट्रिम करना चाहते हैं तो यह कमांड उपयोगी होगा:

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