2013-09-08 6 views
120

मैं एक बैकअप खोल स्क्रिप्ट के हिस्से में निम्न आदेश:राल एक निर्देशिका है, लेकिन संग्रह में पूर्ण पूर्ण पथ को संग्रहीत नहीं करते

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 में और वेब पर अन्य स्थानों पर टैर और बैकअप के बारे में पहले से ही कई प्रश्न हैं, लेकिन उनमें से अधिकतर संपूर्ण उप-निर्देशिका संरचना (फ़्लैटनिंग) छोड़ने के लिए पूछते हैं, या केवल आरंभिक/में जोड़ें नाम (मुझे नहीं पता कि निकालने के दौरान यह वास्तव में क्या बदलता है), लेकिन अब और नहीं।

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

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/ 

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

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

इसे कैसे प्राप्त करें?

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

+0

संभावित डुप्लिकेट [निर्देशिका संरचना के बिना विभिन्न निर्देशिकाओं से फ़ाइलों को संग्रहित करने के लिए टैर का उपयोग कैसे करें] (http://stackoverflow.com/questions/18675523/how-to-use-tar-to-archive-files-from- अलग-निर्देशिका-बिना-निर्देशिका-str) –

+0

स्टैक ओवरफ़्लो प्रोग्रामिंग और विकास प्रश्नों के लिए एक साइट है। यह प्रश्न ऑफ़-विषय प्रतीत होता है क्योंकि यह प्रोग्रामिंग या विकास के बारे में नहीं है। सहायता केंद्र में [मैं यहां कौन से विषय पूछ सकता हूं] (http://stackoverflow.com/help/on-topic) देखें। शायद [सुपर उपयोगकर्ता] (http://superuser.com/) या [यूनिक्स और लिनक्स स्टैक एक्सचेंज] (http://unix.stackexchange.com/) पूछने के लिए एक बेहतर जगह होगी। – jww

उत्तर

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

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

man tar से

:

OTHER OPTIONS 

    -C, --directory DIR 
     change to directory DIR 
+61

अंत में बिंदु को याद न करें, यह महत्वपूर्ण है ;-) –

+2

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

+1

'(डी = $ पीडब्ल्यूडी और सीडी/var/www/site1 && tar-cjf $ d/site1.tar.bz2 * .dat)' –

10

विकल्प -C काम करता है; पूरा पथ के बिना एक टारबॉल की

  1. निर्माण: सिर्फ स्पष्टीकरण के लिए मैं 2 उदाहरण पोस्ट करेंगे पूरा पथ /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

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

+0

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

2

कई टार में -C विकल्प गलत समझा है लगता है।

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

या

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

उत्पन्न tar.gz फ़ाइल के अंदर निरपेक्ष पथ उपसर्ग नहीं निकाला जाएगा।

सरल समाधान source_path (source_dir की पेरेंट निर्देशिका) में cd है और अपनी स्क्रिप्ट में

tar target_path/file.tar.gz source_dir 

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

3

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

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

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

tar -cjf target_path/file.tar.gz * 

यह जड़ फ़ाइलों के रूप में टार फाइल करने के लिए CWD में सभी फ़ाइलों डाल देंगे।

+0

* का उपयोग करके किसी भी "छिपा" .files या। फ़ोल्डर्स को सहेजता नहीं है। (fyi, का उपयोग कर -सी के साथ * विफल रहता है, खोल वर्तमान डीआईआर फैलता है, सीसी नहीं) – Xen2050

संबंधित मुद्दे