2012-10-23 14 views
54

लिनक्स में, मैं फ़ोल्डर्स को एक निश्चित नाम से कैसे हटा सकता हूं जो फ़ोल्डर पदानुक्रम में गहराई से घिरा हुआ है?किसी निश्चित नाम के साथ फ़ोल्डर्स को कैसे हटाएं

निम्नलिखित पथ एक फ़ोल्डर के नीचे हैं और मैं a नामक सभी फ़ोल्डर्स को हटाना चाहता हूं।

1/2/3/a 
1/2/3/b 
10/20/30/a 
10/20/30/b 
100/200/300/a 
100/200/300/b 

मैं मूल फ़ोल्डर से किस लिनक्स कमांड का उपयोग करूँ?

उत्तर

67

यदि लक्ष्य निर्देशिका खाली है, का उपयोग करें खोजने के लिए, केवल निर्देशिका, फिल्टर के साथ फिल्टर नाम से, निष्पादित rmdir:

find -type d -name a -exec rmdir {} \; 

आप रिकर्सिवली, उसकी सामग्री को हटाने के -delete या -prune -exec rm -rf {} \; द्वारा -exec rmdir {} \; बदलना चाहते हैं। अन्य उत्तरों में इन संस्करणों के बारे में विवरण शामिल हैं, उन्हें भी क्रेडिट करें।

79

उपयोग नाम के लिए लगता है "एक" और rm निष्पादित उन अपनी इच्छा के अनुसार नाम हटाने के लिए, इस प्रकार है:

find . -name a -exec rm -rf {} \; 

टेस्ट यह पहली ls का उपयोग कर सूची:

find . -name a -exec ls {} \; 

सुनिश्चित करने के लिए यह केवल निर्देशिका को हटाता है और सादे फाइलों को नहीं हटाता है, "-type d" arg (टिप्पणियों में सुझाए गए अनुसार) का उपयोग करें:

find . -name a -type d -exec rm -rf {} \; 

"{}" प्रत्येक फ़ाइल "ए" के लिए एक प्रतिस्थापन है - निष्पादन द्वारा प्रत्येक के खिलाफ निष्पादन आदेश निष्पादित किया जाता है।

+2

आप शायद एक "प्रकार घ" जोड़ना चाहते हैं वहां बस एक फ़ाइल एक ही नाम से मेल खाता है। –

+1

यह भी ध्यान दें कि यह '1/2/a/3/4' जैसा कुछ पकड़ लेगा, जिसका इरादा नहीं हो सकता है, इसलिए पहले परीक्षण करने की सिफारिश के लिए +1 ... – twalberg

+2

रीको 'echo {}' पहले परीक्षण करने के लिए , 'ls {}' – charneykaye

10
find ./ -name "FOLDERNAME" | xargs rm -Rf 

चाल चलाना चाहिए। चेतावनी, अगर आप गलती से . या /xargs rm -Rf में पंप करते हैं तो आपका पूरा कंप्यूटर इसे वापस पाने के विकल्प के बिना हटा दिया जाएगा, ओएस पुनर्स्थापित करने की आवश्यकता है।

+0

के बजाय यह मेरे लिए काम करता है, thx! – DarkteK

+0

ओह, बस उस छोटे से छोटे जोखिम। यही बात है न? Haha। चेतावनी के लिए सुपर धन्यवाद। मैं निश्चित रूप से उस टाइपिंग गलती करूँगा। – TinkerTenorSoftwareGuy

21

यह भी काम करता है - यह सब फ़ोल्डर "एक" और उनकी सामग्री बुलाया निकाल देगा:

rm -rf `find -type d -name a` 
+4

यह एकमात्र ऐसा है जो वास्तव में काम करता है। – Buffalo

+0

@ बफेलो, कैसे आते हैं? यह डिफो काम करता है लेकिन दूसरों को भी ऐसा करता है। एक env खोजने के लिए आश्चर्यचकित होगा जहां यह काम करता है लेकिन दूसरों को सभी उत्तरों को अनिवार्य रूप से 'find/rm' नहीं दिया जाता है। – wmorrison365

+2

@ wmorrison365 क्योंकि अगर आप पाते हैं। -name a -exec rm -rf {} \; ', जब यह उस निर्देशिका में अधिक आइटम देखने के लिए उस निर्देशिका में प्रवेश करने का प्रयास करता है तो उसे क्रैश हो जाएगा, आपको 'find:' 1/2/3/a 'जैसी कोई त्रुटि दे रही है: ऐसा नहीं फ़ाइल या निर्देशिका'। –

6

मैं था 100 से अधिक फ़ाइलें

तरह
log-12 
log-123 
log-34 
.... 
जवाब ऊपर

मेरे लिए काम नहीं किया

लेकिन निम्न आदेश ने मेरी मदद की।

find . -name "log-*" -exec rm -rf {} \; 

मैं -type. के रूप में तो यह दोनों फ़ाइलों और फ़ोल्डरों जो फ़ोल्डरों रिकर्सिवली भी यह फ़ाइलों है हटाता log-

और rm -rf साथ शुरू होता है हटाता दे दी है।

अगर आप फ़ोल्डरों अकेले चाहते

find -type d -name "log-*" -exec rm -rf {} \; 

अकेले फ़ाइलों

find -type f -name "log-*" -exec rm -rf {} \; 
6

नाम foo साथ सभी निर्देशिकाओं को हटाने के लिए चलाएँ:

find -type d -name foo -a -prune -exec rm -rf {} \; 

अन्य उत्तर एक महत्वपूर्ण याद कर रहे हैं बात: -prune विकल्प। -prune के बिना, जीएनयू खोज मिलान नाम के साथ निर्देशिका को हटा देगा और फिर मिलान करने वाली और निर्देशिकाओं को खोजने के लिए इसमें पुन: प्रयास करने का प्रयास करेगा। -prune विकल्प यह बताता है कि शर्तों से मेल खाने वाली निर्देशिका में पुन: साझा न करें।

1

एक और एक:

"-exec rm -rf {} \;" can be replaced by "-delete" 

find -type d -name __pycache__ -delete  # GNU find 
find . -type d -name __pycache__ -delete # POSIX find (e.g. Mac OS X) 
0

खोज path/to// फ़ोल्डर 1 -name -maxdepth "my_ *" प्रकार -delete d

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