सभी उपनिर्देशिकाओं में कुछ फ़ाइल प्रकारों को कैसे टार करें?


86

मैं एक निर्देशिका और उसके उपनिर्देशिका में सभी .php और .html फ़ाइलों को टार करना चाहता हूं। अगर मैं उपयोग करता हूं

tar -cf my_archive *

यह सभी फाइलों को टार्स करता है, जो मुझे नहीं चाहिए। अगर मैं उपयोग करता हूं

tar -cf my_archive *.php *.html

यह उपनिर्देशिकाओं की अनदेखी करता है। मैं इसे पुनरावर्ती रूप से कैसे बना सकता हूं लेकिन इसमें केवल दो प्रकार की फाइलें शामिल हैं?

जवाबों:


146

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDee फ़ाइलों की संख्या, आदि पर कोई सीमाएं हैं?
user1566515

1
@DeeDee - नहीं, मेरा मतलब था कि आपको परगनों की आवश्यकता नहीं है!
माइक मकुच

@ user1566515 कुछ फ़ाइल सिस्टम सीमा या समग्र स्थान सीमा हो सकती है जो आपकी टार फ़ाइल पर ऊपरी सीमा डाल देगी। यह पूरी तरह से आपके अपने सिस्टम पर निर्भर करता है। अन्यथा, पाइपिंग अनिवार्य रूप से टार फाइल ऑन-द-फ्लाई का निर्माण करेगा, इसलिए आपको फ़ाइल नंबर या आकार से बाध्य नहीं किया जाएगा।
डेडी

धन्यवाद! ... 2 से अधिक शर्तें / तरह की फ़ाइल कैसे जोड़ें?
ग्लूके

5
-o -name [pattern]प्रत्येक नई शर्त के लिए @gluuke का उपयोग करें
DeeDee

15

यदि आप bashसंस्करण> 4.0 का उपयोग कर रहे हैं , तो आप इसका shopt -s globstarछोटा काम करने के लिए शोषण कर सकते हैं :

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

यह सभी .yml फ़ाइलों को जोड़ेगा जो किसी भी उप-निर्देशिका से ऐलिस के साथ शुरू होता है और सभी .json फ़ाइलों को जोड़ देता है जो बॉब के साथ किसी भी उप-निर्देशिका से शुरू होती है।


2
एकमात्र उत्तर जो सिर्फ टार का उपयोग करता है, सबसे अच्छा उत्तर IMO।
सिमोन

2
निर्देशिका के लिए ग्लोब '**' द्वारा छाप के बावजूद, यह आदेश पुनरावर्ती रूप से निष्पादित नहीं करता है (कोई भी उप-फ़ोल्डर्स)
एडी

@Eddie ** को काम करना चाहिए। हो सकता है कि आपके मापदंडों के साथ कुछ अलग हो। यह भी जांच लें कि क्या फोल्डर नाम में कोई जगह है जिसे आप कमांड लाइन में पास करते हैं। यदि नहीं, तो क्या आप अपना वास्तविक कमांड पेस्ट कर सकते हैं?
साईराम कृष

'**' का मूल्यांकन कमांड तक पहुंचने से पहले शेल द्वारा किया जाता है और इसे केवल 2 स्वतंत्र * के रूप में देखा जाता है, जो 0 या वर्णों का समाधान करता है, इसमें निर्देशिकाओं tldp.org/LDP/GNU-Linux-Tools-Summary/ की
एडी

2
@ हेडी हां इसका मूल्यांकन शेल द्वारा किया गया है, हालांकि बैश> 4.0 में एक shopt -s globstarविकल्प है, इसलिए उत्तर सही है और वास्तव में सबसे अच्छा है
रोमन उशेरेंको

13

एक विधि है:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

हालांकि इस विधि के साथ कुछ चेतावनी हैं:

  1. यह विफल हो जाएगा अगर वहाँ किसी भी फाइल या निर्देशिका में रिक्त स्थान के साथ हैं, और
  2. यह विफल हो जाएगा अगर वहाँ बहुत सारी फाइलें हैं कि अधिकतम कमांड लाइन की लंबाई भरी हुई है।

इन पर एक वर्कअराउंड खोज कमांड की सामग्री को एक फाइल में आउटपुट करने के लिए हो सकता है, और फिर टार में "-T, - फाइल्स-फ्रिल से" विकल्प का उपयोग करें।


1) "विफल" से क्या आपका मतलब है कि रिक्त स्थान वाली फाइलें छोड़ दी जाएंगी या टार संग्रह नहीं बनाया जाएगा? 2) मेरे पास लगभग 100K फाइलें हैं। क्या यह अधिकतम कमांड लाइन की लंबाई है?
user1566515 4

1
1. यह आर्काइव बनाएगा, लेकिन यह गुम फाइलों की सूचना देगा। 2. यह बहुत लंबा होगा, मुझे उम्मीद है। इसे देखते हुए, आप सबसे पहले एक विधि का उपयोग कर रहे होंगे जैसे @DeeDee नीचे सुझाता है, यह इन समस्याओं के आसपास काफी अच्छी तरह से काम करेगा।
रॉबिन शेट


0

उन्हें एक फाइल में रखो

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

फिर फ़ाइल को टार के इनपुट के रूप में उपयोग करें, -I या -T आपके द्वारा उपयोग किए जाने वाले टार के संस्करण के आधार पर

प्रतीकात्मक लिंक कॉपी करने के लिए h का उपयोग करें

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

मल्टीकोर या सिर्फ एक कोर के लिए:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

सभी निर्देशिका और इसके उप-निर्देशिकाओं में .php और .html फ़ाइलों के सभी पथ प्राप्त करने के लिए "ढूंढें" और "grep" का उपयोग करें। फिर उन पथ जानकारी को संपीड़ित करने के लिए टार पास करें।

कृपया उन प्रतीकों के साथ सावधान रहें `और '। ध्यान दें कि यह सीमा को हिट करेगा कि आपके वर्ण कमांड लाइन पर कितने वर्णों की अनुमति देगा, अन्य उत्तरों के विपरीत।

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