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


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.