सभी फाइलों को हटाने का आदेश क्या है लेकिन निर्देशिकाओं का नहीं?


23

मान लीजिए कि मेरे पास इस तरह एक निर्देशिका पेड़ है:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

अगर मैंने इस्तेमाल किया rm -r FOLDER/*, तो FOLDER में सब कुछ उप-निर्देशिकाओं सहित हटा दिया जाएगा। मैं वास्तविक निर्देशिकाओं को हटाने के बिना FOLDER और इसके उप-निर्देशिकाओं में सभी फ़ाइलों को कैसे हटा सकता हूं?

जवाबों:


37

आप जो करने की कोशिश कर रहे हैं वह पुनरावर्ती विलोपन है। उसके लिए आपको एक पुनरावर्ती उपकरण की आवश्यकता है, जैसे कि find।

find FOLDER -type f -delete

13

के साथ bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

यहाँ पर ग्लोब का विस्तार फिल्नाम, और केवल फाइलों को हटाने से हुआ।

उपरोक्त ड्राई-रन है, यदि किए जाने वाले परिवर्तनों से संतुष्ट हैं, तो echoवास्तविक हटाने के लिए निकालें:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

अंत में, परेशान globstar:

shopt -u globstar

zshग्लोब क्वालिफायर का लाभ उठाने के साथ :

echo -- FOLDER/**/*(.)

(.) ग्लोब क्वालीफायर है, जो ग्लोब विस्तार को सिर्फ नियमित फाइलों तक सीमित करता है।

उपरोक्त केवल वास्तविक हटाने के लिए फ़ाइल नाम मुद्रित करेगा:

rm -- FOLDER/**/*(.)

2
Zsh ग्लोबिंग के लिए +1। अधिक लोगों को उन भयानक चीजों के बारे में पता होना चाहिए जो zsh कर सकते हैं।
— 13

11

यदि आपके संस्करण का findसमर्थन नहीं करता है, -deleteतो आप वर्तमान निर्देशिका में और नीचे हर फ़ाइल को हटाने के लिए निम्नलिखित का उपयोग कर सकते हैं।

find . ! -type d -exec rm '{}' \;

-exec rm {} +तेजी से होगा, खासकर अगर वहाँ बहुत सारी फाइलें हैं।
— मुरु

और find . ! -type d -exec rm {} +साथ ही लिंक को हटाता है।
— मोनिका

1
@ ममरू: यदि किसी विशेष कार्यान्वयन का findसमर्थन -deleteनहीं करता है -exec ... {} +तो वह संभवत: समर्थन भी नहीं करता है । इससे निपटने के लिए अनुशंसित तरीका है find ... -print0 | xargs -r0 rm(यदि कोई कई संभावित मैचों की उम्मीद करता है)।
— डेविड फ़ॉर्स्टर

5
@DavidFoerster वास्तव में नहीं। -exec ... {} +POSIX है, लेकिन -deleteनहीं है। (न तो -print0वैसे, है।)
— मुरु

@ मुरू: काफी साफ है। मैंने कम से कम दो गैर-पॉसिक्स findकार्यान्वयनों का सामना किया है जो समर्थन करते हैं -print0लेकिन नहीं -exec ... {} +( -deleteहालांकि मुझे इसके बारे में याद नहीं है )। एक ओएस एक्स पर था, दूसरा सोलारिस पर (कुछ साल पहले बहुत रूढ़िवादी रूप से अद्यतन प्रणाली पर)। आप के -print0साथ स्थानापन्न भी कर सकते हैं -printf '%p\0'। वैसे भी, यह उबंटू है और यूनिक्स और लिनक्स नहीं है और उबंटू हमेशा से जीएनयू खोज का उपयोग करता है।
— डेविड फ़ॉर्स्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.