मूल निर्देशिका को शामिल किए बिना एक टार आर्काइव बनाना


62

मैं अपनी स्क्रिप्ट के लिए एक ग्राफिकल प्रोग्राम बनाने की कोशिश कर रहा हूं।

स्क्रिप्ट के अंदर मैं टार आर्काइव बनाने के लिए टार का उपयोग करता हूं।

चित्रमय कार्यक्रम से मुझे फ़ाइल का पूरा नाम मिलता है जिसे मैं एक टार संग्रह बनाना चाहता हूं।

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

मेरे टार आर्काइव में घर, उपयोगकर्ता नाम, dir1, dir2 और selectdir शामिल हैं, जबकि मैं टारड को केवल selectdir सहित संग्रह बनाना चाहता हूं।

जवाबों:


79

इसे पूरा -Cकरने के tarलिए आप विकल्प का उपयोग कर सकते हैं :

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

के मैन पेज से tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

क्या आप जानते हैं कि मैं चयनित पथ में $ पथ को कैसे विभाजित कर सकता / सकती हूं / घर / उपयोगकर्ता नाम / dir1 / dir2 ताकि मैं उपयोगकर्ता -सी विकल्प चुन
सकूं

@SujitMaharjan आप dirname" सेलेडिर " तक सब कुछ निकालने और " सेलेडिर " निकालने के लिए उपयोग कर सकते हैं basename। तर्क के रूप में $ मार्ग के साथ दो आदेशों का प्रयास करें।
एमकेसी

2
यह कहते हुए कि यह GNU और BSD Tar दोनों के लिए मान्य है।
ल्यूक एक्सटन

5
ध्यान दें कि आप -C विकल्प के साथ ग्लोबिंग का उपयोग नहीं कर सकते हैं। tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'काम नहीं करेगा।
क्रिश्चियन लॉन्ग

काम नहीं करता है: टार: चयनित: नहीं कर सकते: स्टेट: ऐसी कोई फ़ाइल या निर्देशिका नहीं है
ट्राइब्लॉयड

11

इस समस्या को हल करने के लिए आप दो तरीकों का उपयोग कर सकते हैं।

मेरी राय में पहला, आसान है। सीधे cdनिर्देशिका में सीधे उस एक के ऊपर जिसे आप संपीड़ित करना चाहते हैं। इस मामले में यह होगा dir2

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

दूसरा तरीका उस विकल्प का उपयोग करना है --transformजो एक sedअभिव्यक्ति लेता है और इसे फ़ाइलों के नाम के खिलाफ चलाता है। नोट: आपको अभिव्यक्ति /में बचना होगा sed

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

क्या पहली विधि को अंत में एक डॉट (।) की आवश्यकता है? मैंने इसे बिना कोशिश किया और मिला tar: Cowardly refusing to create an empty archive:। जब मेरे पास डॉट होता है, तो यह गुस्सा को मूल रूप से एक निर्देशिका का नाम देता है .। तो, करीब है, लेकिन सही नहीं है।
JW01

1
मेरी पिछली टिप्पणी के लिए आगे। मैंने अपनी समस्या हल कर ली। $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *मेरे लिए काम किया। एक डॉट के बजाय तारांकन का उपयोग करना .। अपडेट: Woops - हालांकि मैंने छिपी हुई फाइलें खो दी हैं।
JW01

6

सबसे पहले, कार्यशील निर्देशिका पर जाएं,

cd /your/working/directory/ 

फिर जादू का उपयोग करें *:-)

tar -cvf temp.tar *

मैं छिपी हुई निर्देशिकाओं को संग्रहीत करने की कोशिश कर रहा हूं और अगर मैं उन्हें सीधे (नहीं *) जोड़ देता हूं तो यह काम करता है, लेकिन * का उपयोग करते समय यह केवल संग्रह के नाम को जोड़ता है ...
ओले

1

वास्तव में, मुझे केतन के उत्तर का उपयोग करके एक समस्या मिली

tar -C / home / username / dir1 / dir2 -cvf temp.tar selectdir

जब आप सिर्फ dir2 में सभी फ़ाइलों को कॉपी करना चाहते हैं, तो बस सभी फाइलें फिर मैं पहली बार विचार बाहर आता हूं:

tar -C / home / username / dir1 / dir2 -cvf temp.tar *

हालाँकि, जब आप dir2 डायरेक्टरी में नहीं होते हैं, तो यह समस्या पैदा करेगा क्योंकि आपके वर्तमान डाइरेक्टरॉय में फाइल्स को टारगेट करेगा। और मैंने नीचे कमांड का उपयोग करके समस्या को ठीक किया:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

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