किसी निश्चित नाम के साथ फ़ोल्डर कैसे निकालें


139

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

निम्नलिखित पथ एक फ़ोल्डर के अंतर्गत हैं और मैं नाम वाले सभी फ़ोल्डरों को निकालना चाहूंगा 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

मूल फ़ोल्डर से मुझे लिनक्स कमांड का क्या उपयोग करना चाहिए?


शायद बिंदु याद आ रहा है, लेकिन शायद यह किसी की सहायता करता है: मेरे पास एक मुख्य फ़ोल्डर में 410 फ़ोल्डर हैं - प्रत्येक दो उप-फ़ोल्डर्स के साथ 410 में से प्रत्येक। सभी पहले उप-फ़ोल्डरों को 'अंतिम' नाम दिया गया है और इसमें संपादित पीडीएफ़ और एक वर्ड कंटेंट सूची है। Tif_pdf_various_names नाम के सभी दूसरे उप-फ़ोल्डरों में मूल रूप से स्कैन की गई टिफ फाइलें (कुछ 200 पेज तक), उनके अन-एडिट किए गए पीडीएफ़ और ड्राफ्ट .docx सामग्री सूची - इस प्रकार एक घर संग्रह का संग्रह होता है। मुझे 410 फ़ोल्डर का संग्रह बनाने की आवश्यकता थी जिसमें केवल अंत में संपादित सामग्री थी - 4TB के करीब टिफ़ के साथ। सबसे आसान विधि का उपयोग किया गया था (माइक में
Jurie

जवाबों:


155

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

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

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


9
क्या आप कृपया बता सकते हैं कि क्या {} \;करता है?
विंकलार्र

6
{}"प्रत्येक मिलान फ़ाइल / फ़ोल्डर के लिए" के रूप में पढ़ा जा सकता है - यानी यह प्रत्येक "पाया" फ़ाइल / फ़ोल्डर के लिए विकल्प है। खंड के \;लिए एक टर्मिनेटर है -exec
wmorrison365

2
यह मैं देता एक त्रुटि "नहीं हटा सकते हैं" जब निर्देशिका खाली नहीं है
blindeyes

1
-prune@ डेविड ग्रेसन सुझाव के अनुसार उत्तर को ध्वज जोड़ने पर विचार करें । इसके बिना, findअभी भी अभी लापता फ़ोल्डर पर जाने की कोशिश करेगा और अंततः एक त्रुटि कोड के साथ बाहर निकल जाएगा, जो कि एक डॉकर बिल्ड को विफल कर सकता है।
Czyzby

160

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

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

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

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

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

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

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


4
आप शायद एक "-टाइप डी" जोड़ना चाहते हैं, जिसमें एक फ़ाइल उसी नाम से मेल खाती है।
मार्क लोसर

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

9
रिको ने echo {}पहले इसका परीक्षण किया, इसके बजायls {}
चार्नी केए

2
यहाँ मेरी जाना node_modules/
सरफेट

6
मैंने उपयोग किया find . -name a -type d -exec rm -rf {} \;और यह काम किया, हालांकि इसे find: ‘./subdir/subdir/a’: No such file or directoryहटाए गए प्रत्येक निर्देशिका के लिए मुद्रित किया गया।
पचोरफ्लो

59

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

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

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

4
@ wmorrison365 क्योंकि अगर आप ऐसा करते हैं find . -name a -exec rm -rf {} \;, तो यह पता चलेगा कि यह उस निर्देशिका में प्रवेश करने की कोशिश करता है, जो आपको अधिक वस्तुओं की तलाश में प्रवेश कराती है , जिससे आपको एक त्रुटि मिलती है find: '1/2/3/a': No such file or directory
एलेक्स ग्रोनहोम 19

@ एलेक्स ग्रोनहोम निश्चित है, लेकिन 'ए' नाम के सभी फ़ोल्डर फिर भी हटाए गए हैं। जैसा कि आप कहते हैं, बाद में हटाए गए 'ए' फ़ोल्डर के अंदर नहीं देख सकते, लेकिन यह कोई फर्क नहीं पड़ता। डिलीट करने से पहले बाद की प्रोसेसिंग के लिए 'ए' की सामग्री रखना चाहते हैं, जो ओपी ने पूछा था, वह एक अलग उपयोग-मामला है।
wmorrison365

6
@ wmorrison365 हाँ, निर्देशिकाओं को हटा दिया गया है, लेकिन मुझे नहीं लगता कि यह एक समाधान की सिफारिश करना अच्छा है जहां कमांड विफल रहता है (एक नॉनज़रो एग्जिट कोड देता है)।
एलेक्स ग्रोनहोम

1
यह मुझे एक त्रुटि दे रहा था illegal option --t। मुझे निर्देशिका को ( stackoverflow.com/questions/25840713/… ) में खोजने के लिए भी पास करना पड़ा rm -rf `find . -type d -name a`:।
स्टीव हैरिसन

25

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

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

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


21

मैंने यहां अपना उपयोग समाप्त करने node_modulesसे पहले अपने फ़ोल्डर्स को हटाने के लिए देख रहा था rsync। एक मुख्य आवश्यकता यह है कि node_modulesफ़ोल्डर को नेस्ट किया जा सकता है, इसलिए आपको -pruneविकल्प की आवश्यकता है ।

पहले मैंने इसे हटाए जाने वाले फ़ोल्डरों को नेत्रहीन रूप से सत्यापित करने के लिए चलाया:

find -type d -name node_modules -prune

फिर मैंने उन सभी को हटाने के लिए इसे चलाया:

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

पिस्ता को धन्यवाद


आह कि अच्छी तरह से काम किया है, यह कुछ बनाने के लिए आप आसानी से उपयोग कर सकते हैं आप इसे एक छोटे से sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
गोले के

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

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


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

9

मेरे पास 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 {} \;

8

कई उत्तरों को मिलाकर, यहाँ एक कमांड है जो लिनक्स और मैकओएस दोनों पर काम करता है

rm -rf $(find . -type d -name __pycache__)

केवल एक ही ने मेरे लिए काम किया, जिसमें त्रुटियां भी नहीं थीं
क्लार

7

और एक:

"-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)

3
यह उत्तर केवल खाली फ़ोल्डर के लिए काम करता है। -deleteगैर-खाली फ़ोल्डर नहीं निकालता है।
मणिनक

OSX संस्करण जोड़ने के लिए धन्यवाद
schu34

6

यह कमांड मेरे लिए काम करता है। यह अपने काम को पुनरावर्ती करता है

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

। - मौजूदा फोल्डर

"node_modules" - फ़ोल्डर का नाम


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