2013-07-30 5 views
9

मैं एक स्क्रिप्ट लिख रहा हूं जिसे दो निर्देशिकाओं, mysql और temp को छोड़कर किसी निर्देशिका से सब कुछ मिटाने की आवश्यकता है।बैश। सभी फाइलों और निर्देशिकाओं को हटाएं लेकिन कुछ

मैं इस की कोशिश की है:

ls * | grep -v mysql | grep -v temp | xargs rm -rf 

लेकिन यह भी है कि मैं की जरूरत नहीं है उनके नाम में mysql है कि सभी फाइलों को रहता है,। यह किसी अन्य निर्देशिका को भी हटा नहीं देता है।

कोई विचार?

उत्तर

21

आप कोशिश कर सकते हैं:

rm -rf !(mysql|init) 

कौन सा POSIX defined है:

Glob patterns can also contain pattern lists. A pattern list is a sequence 
of one or more patterns separated by either | or &. ... The following list 
describes valid sub-patterns. 

... 
!(pattern-list): 
    Matches any string that does not match the specified pattern-list. 
... 

नोट: कृपया, पहले यह परीक्षण करने के लिए समय लेने के लिए! या तो कुछ परीक्षण फ़ोल्डर बनाते हैं, या बस echo पैरामीटर प्रतिस्थापन, के रूप में विधिवत @mnagel द्वारा नोट:

echo !(mysql|init) 

Adding useful information: यदि मिलान नहीं सक्रिय, आप सक्षम/का उपयोग करके इसे निष्क्रिय करने के लिए हो सकता है है:

shopt extglob     # shows extglob status 
shopt -s extglob    # enables extglob 
shopt -u extglob    # disables extglob 
+0

एक आकर्षण की तरह काम करता है! धन्यवाद! (निश्चित रूप से कहीं और परीक्षण कर रहा था, चीजों को तोड़ना नहीं चाहते हैं) – Bobo

+0

यदि यह आपके प्रश्न का उत्तर देता है, तो उत्तर को स्वीकार के रूप में चिह्नित करें। यह दोनों दूसरों को यह जानने की अनुमति देता है कि प्रश्न का उत्तर दिया गया है, क्योंकि इसका मतलब है कि आप दूसरों की मदद करने के लिए प्रयासों को स्वीकार करते हैं। उत्तर स्वीकार करने के लिए, मतदान तीर के नीचे, टिक चिह्न पर क्लिक करें। – Rubens

+0

इस पर काम कर रहा है। मुझे 1 और मिनट इंतजार करना है। – Bobo

1

आप ढूंढ सकते हैं, mysql और temp को अनदेखा कर सकते हैं, और फिर उन्हें आरएम-आरएफ कर सकते हैं।

find . ! -iname mysql ! -iname temp -exec rm -rf {} \; 
+4

यह दो फ़ोल्डरों के अंदर फ़ाइलों को भी हटा देता है – Bobo

+0

इन फ़ोल्डर्स के अंदर सब कुछ हटाने के लिए, 'find। -maxdepth 1! -इनम mysql! -इनम temp -exec rm -rf {} \; ', या यहां तक ​​कि बेहतर 'खोजें। -मैक्सडेप 1! - iname mysql!-इनम temp -delete' – mikewaters

2

यह आमतौर पर find के लिए एक नौकरी है। निम्न आदेश (-rf जोड़ें यदि आपने एक पुनरावर्ती हटाना होगा) का प्रयास करें:

find . -maxdepth 1 \! \(-name mysql -o -name temp \) -exec rm '{}' \; 

(यही है, . नहीं बल्कि सबडायरेक्टरियों [mysql नामित या tmp नामित] नहीं कर रहे हैं और उन पर rm फोन में प्रविष्टियों पाते हैं।)

+0

यह दो फ़ोल्डर्स – Bobo

+0

के अंदर फ़ाइलों को हटा देता है 'maxdepth' विकल्प के साथ नहीं। मिलान करने वाली फ़ाइलों की एक सूची प्राप्त करने के लिए '-exec rm '{}' \;' को हटाएं, जिसमें नीचे कुछ भी शामिल नहीं होगा।/'। – chrylis

+1

यह वापस '.' वापस लौटाता है, इसलिए यदि आप' आरएम-आरएफ 'निष्पादित कर रहे हैं, तो संभावित निर्देशिका को हटाने से बचने के लिए –

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