2009-08-14 10 views
21

मैं कुछ जो शायद बहुत सरल है करने के लिए कोशिश कर रहा हूँ, मैं इस तरह के रूप में एक निर्देशिका संरचना है:सभी फाइलों को हटाएं लेकिन सभी निर्देशिकाओं को एक बैश स्क्रिप्ट में रखें?

dir/ 
    subdir1/ 
    subdir2/ 
     file1 
     file2 
     subsubdir1/ 
      file3 

मैं एक bash स्क्रिप्ट में कोई आदेश है कि सभी फाइलों पर dir से रिकर्सिवली को नष्ट करेगा चलाना चाहते है नीचे, लेकिन सभी निर्देशिका छोड़ दें। Ie:

dir/ 
    subdir1/ 
    subdir2/ 
     subsubdir1 

इसके लिए उपयुक्त आदेश क्या होगा?

+0

अधिक मेरे लिए एक SuperUser सवाल की तरह लग रहा है, तो आप क्या सोचते हैं? –

+4

नहीं, मैं एक बैश स्क्रिप्ट लिख रहा हूं, यह प्रोग्रामिंग है, और इस साइट पर बहुत सारे बैश स्क्रिप्टिंग प्रश्न हैं :-) – Grundlefleck

+4

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

उत्तर

38
find dir -type f -print0 | xargs -0 rm 

find सूचियों सभी फ़ाइलों कि किसी दिए गए निर्देशिका में कुछ एक्सप्रेशन से मेल, रिकर्सिवली। -type f नियमित फाइलों से मेल खाता है। -print0\0 का उपयोग करके डिलीमीटर के रूप में नाम प्रिंट करने के लिए है (\n सहित किसी अन्य चरित्र के रूप में, पथ पथ में हो सकता है)। xargs मानक इनपुट से फ़ाइल नाम एकत्र करने और उन्हें पैरामीटर के रूप में डालने के लिए है। -0 यह सुनिश्चित करना है कि xargs\0 डेलीमीटर समझ जाएगा।

xargs पैरामीटर सूची बहुत बड़ी हो जाएगी, तो rm पर कई बार कॉल करने के लिए पर्याप्त बुद्धिमान है। तो यह sth कॉल करने की कोशिश करने से काफी बेहतर है। rm $((find ...) की तरह। find ... -exec rm \{\} जैसे प्रत्येक फ़ाइल के लिए rm पर कॉल करने से भी तेज़ है।

+0

+1, जैसा कि अच्छा है :-) – Grundlefleck

+0

+1 फ़ाइल नामों में रिक्त स्थान और अन्य "अप्रत्याशित" वर्णों को संभालने के लिए। – chepner

8
find dir -type f -exec rm {} \; 

जहां dir तुम कहाँ से

नोट फ़ाइलों को हटाने के तुम सब कुछ को हटाना चाहते हैं कि यह केवल नियमित रूप से फ़ाइलें, नहीं सिमलिंक, नहीं उपकरणों, आदि को नष्ट करेगा चाहते हैं के शीर्ष स्तर है निर्देशिका को छोड़कर, का उपयोग

find dir -not -type d -exec rm {} \; 
+0

+1, अच्छे के रूप में परीक्षण किया गया :) – Grundlefleck

+0

+1। मैंने उद्धरण जोड़े, क्योंकि वे फ़ाइल नामों को संभालने के दौरान आवश्यक हैं जिनमें व्हाइटस्पेस होता है। – Stephan202

+0

@ स्टीफन 202 यह गलत है। '{} '' '{}' जैसा कि शैल का संबंध है, वही है, और' ढूंढ 'केवल '{}' देखता है क्योंकि शेल कमांड लाइन तर्कों को' ढूंढने 'से पहले उद्धरण हटा देता है। –

8
find dir -type f -exec rm '{}' + 
+1

'+' क्या करता है? – Grundlefleck

+3

'-exec' कमांड को दो तरीकों से समाप्त किया जा सकता है: अर्धविराम या प्लस साइन के साथ। यदि आप अर्धविराम का उपयोग करते हैं, तो प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया उत्पन्न होती है।यदि आप प्लस साइन का उपयोग करते हैं, तो केवल एक प्रक्रिया उत्पन्न होती है। (ठीक है, वास्तव में, यदि कमांडलाइन बहुत लंबी हो जाती है, तो कई प्रक्रियाएं उत्पन्न होती हैं - मूल रूप से, यह 'xargs' की तरह काम करती है लेकिन सभी उद्धरण समस्याओं के बिना।) कहें, आपके पास दो फाइलें हैं जिन्हें ए और बी कहा जाता है, फिर अर्धविराम के साथ दो प्रक्रियाएं पैदा की जाएंगी: 'आरएम ए' और 'आरएम बी'। प्लस के साथ, केवल एक प्रक्रिया उत्पन्न हो जाती है: 'आरएम ए बी'। -delete ध्वज के लिए –

9

जीएनयू के find के साथ आप -delete क्रिया का उपयोग कर सकते हैं:

find dir -type f -delete 
मानक find साथ

आप -exec rm उपयोग कर सकते हैं:

find dir -type f -exec rm {} + 
+0

+1 :) – Christoffer

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