टी एल; डॉ
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
कुछ शर्तों के साथ (केवल फ़ाइलें, डीआईआर और सिमिलिंक संग्रह):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
व्याख्या
नीचे दुर्भाग्य ./से संग्रह में एक मूल निर्देशिका शामिल है :
tar -czf mydir.tgz -C /my/dir .
आप --transformकॉन्फ़िगरेशन विकल्प का उपयोग करके उस निर्देशिका से सभी फ़ाइलों को स्थानांतरित कर सकते हैं , लेकिन इससे .निर्देशिका से छुटकारा नहीं मिलता है। कमांड को वश में करना मुश्किल हो जाता है।
आप $(find ...)कमांड में फ़ाइल सूची जोड़ने के लिए उपयोग कर सकते हैं (जैसे कि मैग्नस के उत्तर में ), लेकिन यह संभावित रूप से "फ़ाइल सूची बहुत लंबी" त्रुटि का कारण बनता है। सबसे अच्छा तरीका यह है कि इसे तार के -Tविकल्प के साथ मिलाएं , जैसे:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
मूल रूप से यह जो करता है वह आपकी निर्देशिका के तहत सभी फाइलों ( -type f), लिंक ( -type l) और उपनिर्देशिकाओं ( -type d) की सूची है, सभी फाइलनामों का उपयोग करके सापेक्ष बनाते हैं -printf "%P\n", और फिर टार कमांड को पास करते हैं (यह एसटीडीएन का उपयोग करके फाइलनेम लेता है -T -)। -Cविकल्प की जरूरत है ताकि टार जानता है, जहां रिश्तेदार नाम के साथ फ़ाइलें स्थित हैं है। --no-recursionझंडा ताकि टार फ़ोल्डरों यह (डुप्लिकेट फ़ाइलें के कारण) संग्रह करने के लिए कहा है में recurse नहीं करता है।
यदि आपको फ़ाइल नाम के साथ कुछ विशेष करने की आवश्यकता है (फ़िल्टरिंग, सिम्बलिंक का पालन करना आदि), तो findकमांड बहुत शक्तिशाली है, और आप इसे tarउपरोक्त कमांड के भाग को हटाकर इसका परीक्षण कर सकते हैं :
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
उदाहरण के लिए यदि आप पीडीएफ फाइलों को फ़िल्टर करना चाहते हैं, तो जोड़ें ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
गैर-जीएनयू पाते हैं
कमांड printf(GNU में उपलब्ध find) का उपयोग करता है जो findसापेक्ष परिणामों के साथ इसके परिणामों को प्रिंट करना बताता है। हालाँकि, यदि आपके पास GNU नहीं है find, तो यह पथ को सापेक्ष बनाने के लिए काम करता है (माता-पिता को निकालता है sed):
find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
tar -czf? मेरे मामले में यह केवल फाइलों को संग्रहीत कर रहा है और निर्देशिका को नहीं। जब मैं सिर्फtarडायरेक्टरी को इसमें शामिल करता हूं , लेकिन इसके साथtar -czfकेवल फाइलों को जोड़ रहा है।