डायरेक्टरी की सभी फाइलें कैसे हटाएं?


76

मैं एक निर्देशिका में सभी फ़ाइलों और उपनिर्देशिकाओं को हटाने की कोशिश कर रहा हूं। मैं rm -rसभी फ़ाइलों को हटा देता था, लेकिन मैं शीर्ष निर्देशिका को छोड़कर सभी फ़ाइलों और उपनिर्देशिकाओं को हटाना चाहता हूं ।

उदाहरण के लिए, मेरे पास एक शीर्ष निर्देशिका है images। यह फ़ाइलें हैं header.png, footer.pngऔर उप-निर्देशिका।

अब मैं हटाना चाहता हूं header.png, footer.pngऔर उपनिर्देशिका, लेकिन नहीं images

मैं लिनक्स में यह कैसे कर सकता हूं?


1
निर्देशिका में सीडी और rm -Rfवहाँ सभी फ़ाइलों और निर्देशिकाओं में से एक करते हैं।
नौफल इब्राहिम

जवाबों:


59

यदि आपकी शीर्ष-स्तरीय निर्देशिका को कहा जाता है images, तो चलाएं rm -r images/*। यह प्रत्येक फ़ाइल या निर्देशिका पर *चलने के लिए शेल ग्लोब ऑपरेटर का उपयोग करता है ।rm -rimages


30
छिपी हुई फ़ाइल को हटाया नहीं जाएगा।
रीटो

50

छिपी हुई फ़ाइलों को हटाने के लिए, आपको निर्दिष्ट करना होगा:

rm -r images/* images/.*

ऐसे गोले जिनके ग्लब्स शामिल हैं .और .., इससे त्रुटि उत्पन्न होगी

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

लेकिन यह छिपी हुई फ़ाइलों को हटा देगा।

इरोमेसेज के बिना एक दृष्टिकोण माइंडथ के साथ खोजने / हटाने का उपयोग करना है। यह गनु-खोज है।

find images -mindepth 1 -delete

आपके खोज में कमी -mindepthया -deleteभविष्यवाणी हो सकती है, जिस स्थिति में आप कर सकते हैं:

find images/. ! -name . -prune -exec rm -rf {} +

मेरा सुझाव 'rm -r images /.*' का उपयोग करना था जो 'छवियों / ..' से मेल खाएगा, लेकिन 'images /../ ..' नहीं। पुनरावृत्ति ऊपर की ओर नहीं जा सकती, क्योंकि 'चित्र /../ चित्र / ..' फिर से वही निर्देशिका है।
उपयोगकर्ता अज्ञात

4
@DarkHeart GNU के लिए कम से कम 1994 के बाद सेrm .* नहीं हटाता है .या नहीं करता है ..और UNIX के लिए 70 के दशक के बाद से होने की संभावना है । यह बेहद संभावना नहीं है कि आप एक ऐसी प्रणाली पाएंगे जहां rm .*संग्रहालय के बाहर फाइलसिस्टम को ऊपर की ओर खींचता है।
terdon

21

निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं ( छिपे हुए लोगों सहित ) को हटाने के लिए , आप निम्नलिखित प्रयास कर सकते हैं:

  • ls -Abसभी फाइलों / निर्देशिकाओं का मिलान करने के लिए उपयोग करें

    cd dir_name && rm -rf `ls -Ab`
    
  • findसभी फाइलों / निर्देशिकाओं का मिलान करने के लिए उपयोग करें

    find dir_name -mindepth 1 -delete
    

    या, यदि आपका findसमर्थन नहीं करता है -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • फ़ोल्डर को हटाएं, फिर इसे फिर से बनाएँ

    rm -rf dir_name && mkdir dir_name
    
  • बैश में,

    shopt -s dotglob  
    rm -rf dir_name/*
    

ध्यान दें कि rm -rf *यदि आप किसी निर्देशिका में फ़ाइलों का ज्ञान नहीं रखते हैं, तो यह कमांड सुरक्षित नहीं है, क्योंकि -(हाइफ़न) से शुरू होने वाली फ़ाइल को rmध्वज के रूप में व्याख्या किया जाएगा ...
VasyaNovikov

1
EDIT: इसे सुरक्षित करने के लिए, उपयोग करेंrm -rf ./* ./.*
VasyaNovikov

9

निर्देशिका के अंदर पुनरावर्ती सभी नियमित फ़ाइलों को हटाने के लिए , यह कमांड (GNU या FreeBSD मानकर find) काफी अच्छा है:

find . -type f -delete

यह सभी गैर-नियमित फ़ाइलों को छोड़ देता है जैसे कि सिम्लिंक्स (चाहे वे नियमित फ़ाइलों की ओर इंगित करें या नहीं), निर्देशिका, फ़िरोज़, साइज़, डिवाइस ...

यह सभी देखें:

find . ! -type d -delete

निर्देशिका को छोड़कर किसी भी प्रकार की फ़ाइलों को हटाने के लिए ।


6

इस संस्करण का प्रयास करें:

 rm -r test/*

1
यह छिपी हुई फ़ाइलों को नहीं हटाएगा ("" के साथ शुरू होने वाले)।
22 फरवरी को gbmhunter

3

मैं findयहाँ कमांड का उपयोग कर रहा हूँ :

चरण 1: सभी फ़ाइलों को ढूंढें और उन्हें हटा दें:

find /path/to/directory/ -type f -exec rm {} \;

उदाहरण:

find /home/user/Desktop/images/ -type f -exec rm {} \;

चरण 2: सभी उप-निर्देशिका खोजें और उन्हें हटा दें:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dइसमें शामिल है .तो निर्देशिका को ही हटा देगा। आपको -mindepthस्विच का उपयोग करने की भी आवश्यकता है जैसा कि अन्य ने कहा है।
आर्थर टाका

3

यह सवाल था कि किसी डायरेक्टरी को खाली करना = किसी डायरेक्टरी की सामग्री को छुपाना, जिसमें छिपी हुई फाइलें भी शामिल हैं, न कि डायरेक्टरी ही। -Mindepth 1 के साथ खोज कमांड वास्तव में जाने का सही तरीका है, लेकिन त्रुटि संदेशों से बचने के लिए इसे -maxdepth 1 के साथ जोड़ा जाना चाहिए:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

rm का सिंटैक्स है:

rm [OPTION]... FILE...

इसलिए, आपको उपयुक्त पथ को स्पष्ट रूप से बताना होगा, जैसे

rm -r sub_dir/

0

आप निम्न आदेश का उपयोग करके निर्देशिका निकाल सकते हैं:

sudo rm -r directoryname1/2/3/*

यह 3 / * के बाद पूरी निर्देशिका को हटा दिया जाएगा।

उदाहरण sudo rm -r डाउनलोड / गीत / *

यह उन सभी फ़ाइलों को हटा दिया जाएगा जो भीतर हैं Downloads/song


0

यह मेरे लिए पूरी तरह से काम करता है, हर बार काम किए गए कई रूपों का परीक्षण किया।

उस डायरेक्टरी से जो इमेजेस डायरेक्टरी रखती है।

rm -frd ./images/*

इससे पहले:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

उपरांत:

images/

सुनिश्चित नहीं हैं कि यह मूल प्रश्न में स्पष्ट कर दिया गया था, लेकिन अभी करते रहे कि जब तक आप dotglob सक्षम, यह किसी भी "डॉट फ़ाइल" या छवियों के तहत डॉट निर्देशिका को छोड़ देगा ( mkdir images/.somedir; touch images/.somefile)
जेफ स्कालर

0

वर्तमान निर्देशिका में सभी फ़ाइलों और उपनिर्देशिकाओं को हटाने के लिए, जिनमें छिपा हुआ है, त्रुटि संदेश के बिना :

rm -rf .[^.] .??* *

या, मूल निर्देशिका से:

rm -rf images/.[^.] images/.??* images/*

से https://serverfault.com/a/47940/269538



-2

फ़ोल्डर "परीक्षण" और अंदर की सभी फाइलें हटाएं:

 rm -r test

अंदर सभी फ़ाइलों को हटाएं, लेकिन फ़ोल्डर को "परीक्षण" रखें:

 rm -r test/*

-4

फ़ोल्डर में cd तब निम्न कमांड निष्पादित करें:

ls |xargs rm -rf

2
यह उन फिल्नामों पर विफल हो जाएगा जिनमें व्हाट्सएप शामिल है। मैं अन्य कमांड के इनपुट के रूप में ls के आउटपुट का उपयोग करने के खिलाफ सलाह दूंगा, यह आमतौर पर असुरक्षित है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.