एक निर्देशिका में सभी पीढ़ियों को बनाए रखें, निर्देशिका संरचना को बनाए रखें


11

मैं एक संपीड़ित टारबॉल बनाने की कोशिश कर रहा हूं जिसमें सभी पीडीएफ फाइलें हैं जो मेरी एक निर्देशिका में मौजूद हैं। निर्देशिका संरचना को बनाए रखने की आवश्यकता है। खाली निर्देशिका की जरूरत नहीं है, लेकिन मैं वास्तव में परवाह नहीं है अगर वे वहाँ हैं।

उदाहरण के लिए, मान लीजिए कि मेरे पास एक निर्देशिका थी जो इस तरह दिखती थी:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

कमांड चलाने के बाद, मैं इसे dir.tar.gzसम्‍मिलित करना चाहूंगा :

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

मुमकिन?

जवाबों:


10

यह सभी PDF को सूचीबद्ध करेगा:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

आप xargsइसे एकल स्थान-सीमांकित रेखा के रूप में प्राप्त करने के लिए पाइप कर सकते हैं , और tarसंग्रह बनाने के लिए इसे खिला सकते हैं :

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(यह तरीका खाली निर्देशिकाओं को छोड़ देता है)


1
यह बहुत बढ़िया है, मदद के लिए धन्यवाद। यहाँ मैं क्या लेकर आया हूँ:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
मैट अलेक्जेंडर

3
@mattalexx: सावधान रहें कि यदि फ़ाइल नामों में से किसी में स्थान या \'"xargs का दोष है तो यह कमांड काम नहीं करेगा , और बहुत सारे फ़ाइल नाम (कर्नेल की गलती) होने पर काम नहीं करेगा।
गिल्स एसओ- बुराई को रोकना '

2
@ गिल्स स्पेस और सिंगल कोट्स के साथ फाइलनामों के बारे में, इस बात -printf '"%p"\n'का ध्यान रखता है (कम से कम मेरे लिए यह किया था)।
मैट अलेक्जेंडर

1
@ गिलेश प्रतिबंध के बारे में दिलचस्प। लिनक्स में कमांड में आपके कितने तर्क हो सकते हैं?
मैट अलेक्जेंडर

5
ओह, "काम नहीं करेगा" पर, ध्यान दें कि यहां विफलता मोड यह है कि यदि कमांड लाइन बहुत लंबी है, तो xargs इसे विभाजित करेगा, ताकि अंतिम टार आह्वान चुपचाप पिछले चालान द्वारा लिखी गई फ़ाइलों को अधिलेखित कर देगा
गाइल्स का SO- बुराई से दूर रहना '

6

बैश b4 या zsh और GNU टार के साथ:

tar -czf dir.tar.gz dir/**/*.pdf

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

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

वैकल्पिक रूप से (और आंशिक रूप से) आप पैक्स के साथ संग्रह बना सकते हैं ।

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

पहला अपना नाम बदले बिना -sसभी .pdfफाइलों को शामिल करने के लिए कहता है । दूसरी -sसभी फाइलों को खाली नाम देने के लिए कहती है, जिसका अर्थ वास्तव में उन्हें संग्रह में शामिल नहीं करना है।


अरे हाँ, मेरा मतलब ज़ीश का ज़िक्र करना था **; मैं भी एहसास नहीं था बैश 4 अब था कि
माइकल Mrozek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.