2012-12-18 11 views
14

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

उदाहरण के लिए, tar -cvzf test.tar.gz /home/path/test - जहां मैं फ़ोल्डर test को संपीड़ित करना चाहता हूं। हालांकि, मैं वास्तव में संपीड़न को समाप्त करता हूं /home/path/test है। क्या इससे बचने के लिए कुछ भी किया जा सकता है? मैंने -सी ऑपरेंड के साथ खेलने का प्रयास नहीं किया है।

+0

क्या इसमें कोई प्रोग्रामिंग संदर्भ है? यदि नहीं, तो यह शायद स्टैक ओवरफ़्लो के बजाय यूनिक्स.एसई पर है। – dmckee

+0

सच है, हालांकि यह शेलस्क्रिप्टिंग में प्रासंगिक हो सकता है, इसे इस तरह टैग नहीं किया गया है .. –

+0

मैं इसे शैल स्क्रिप्ट के लिए उपयोग कर रहा हूं, लेकिन मैंने समस्या को संदर्भ के बाहर एक में कम कर दिया। मुझे समाधान खोजने के लिए अतिरिक्त विवरण (उर्फ संदर्भ) प्रदान करने की आवश्यकता हो सकती है, इसलिए मैंने यहां पोस्ट किया। मैं इसे अब इस तरह टैग करूंगा। –

उत्तर

17

उपयोग -C निर्देशिका जो से फाइल देखने के लिए की तरह आप चाहते निर्दिष्ट करने के लिए, और फिर के रूप में है कि निर्देशिका से देखा फ़ाइलें निर्दिष्ट करें:

tar -cvzf test.tar.gz -C /home/path test 
+1

यह अभी भी निर्देशिका संरचना * रिश्तेदार * को निर्दिष्ट रूट निर्देशिका में संरक्षित करता है, जो कि सवाल नहीं पूछता है (हालांकि स्पष्ट रूप से ओपी की आवश्यकता है), लेकिन +1 क्योंकि यह वही है जो मैं खोज रहा था (और दूसरे जवाब में एकतरफा-झुकाव दृष्टिकोण एक विचित्र चीज़ की तरह दिखता है)। –

23

यह बदसूरत है ... लेकिन यह काम करता है ...

मुझे यह समस्या थी लेकिन एकाधिक फ़ोल्डर्स के साथ, मैं बस हर फाइल को फ्लैट करना चाहता था। आप एक sed अभिव्यक्ति को पारित करने के लिए "ट्रांसफॉर्म" विकल्प का उपयोग कर सकते हैं और ... यह अपेक्षा के अनुसार काम करता है।

इस

अभिव्यक्ति है:

's/.*\///g' (सब कुछ हटाने से पहले '/')

यह अंतिम आदेश है:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info 
+5

यह एकमात्र उत्तर है जिसे मैंने देखा है * वास्तव में * जो मैं ढूंढ रहा हूं वह करता है। –

+0

http://serverfault.com/a/566345/343194 के साथ संयोजन में एकाधिक निर्देशिकाओं के लिए बेहतर परिणाम प्राप्त किया जा सकता है। कुछ 'ढूंढें ./commondir -type f | tar --transform's/.*\/// g '-cvzf ./file.tar.gz - फाइल-से =/dev/stdin'। इस तरह खाली बाल निर्देशिका को बाहर रखा जाएगा। –

0

बहु निर्देशिका उदाहरण

cvzf टार मेरी .tar.gz example.zip -C dir1 files_under_dir1 -C dir2 files_under_dir2

डीआईआर 1/2 के तहत फाइलों में पथ नहीं होना चाहिए।

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