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


289

निकटतम मैं मिल गया है

# rm /path/to/directory/*.*

लेकिन यह उन फ़ाइलों के लिए काम नहीं करता जिनके पास एक्सटेंशन नहीं है ...

जवाबों:


340

लिनक्स एक्सटेंशन का उपयोग नहीं करता है। यह फ़ाइल के निर्माता पर निर्भर है कि वह यह तय करना चाहता है कि क्या उसका नाम एक्सटेंशन है। लिनक्स पहली बाइट को देखने के लिए यह पता लगाता है कि वह किस प्रकार की फ़ाइल के साथ काम कर रही है।

निर्देशिका उपयोग में सब कुछ हटाने के लिए:

rm /path/to/directory/*

आप -rविकल्प का उपयोग कर सकते हैं , उदाहरण के लिए:

rm -r /path/to/directory/*

उस निर्देशिका के अंदर किसी भी उप निर्देशिका (उनकी सभी सामग्री के साथ) को निकालने के लिए जिसे आप हटा रहे हैं। अन्यथा यह आपको यह सूचित करने में त्रुटि दिखाएगा कि यह निर्देशिका को हटा नहीं रहा है।


13
अगर आप भी चलाने shopt -s dotglobसे पहले छुपी हुई फाइलों को हटाना चाहते हैंrm (...)
— danjjl

7
* का अर्थ है all files;) का *.*अर्थ है सभी फाइलें जिनका .नाम कहीं है
— रिनजविंड

10
@ रिनविंड, अधिक सटीक रूप से, तारांकन का अर्थ है "शून्य या किसी भी वर्ण का अधिक"। तो *a*शून्य या अधिक वर्णों का अर्थ है, उसके aबाद शून्य या अधिक वर्ण। यह फ़ाइल नाम से मेल खाएंगे happy, apple, aया la।
— असंतुष्टगीतगृह

7
@ user784637 आप बहुत आसानी से प्रभावित हैं
— बारपॉप

1
यहां वह कमांड है जो आप चाहते हैं: rm - *
— anon58192932

168
  • इसकी सभी सामग्रियों के साथ फ़ोल्डर को हटाने के लिए ( सभी आंतरिक फ़ोल्डर सहित ):

    rm -rf /path/to/directory
    
  • फ़ोल्डर की सभी सामग्री को हटाने के लिए ( सभी आंतरिक फ़ोल्डर सहित ), लेकिन फ़ोल्डर ही नहीं:

    rm -rf /path/to/directory/*
    

    या

    rm -rf /path/to/directory/{*,.*}
    

    यदि आप यह सुनिश्चित करना चाहते हैं कि छिपी हुई फाइलें / निर्देशिकाएं भी हटा दी जाएं।

  • एक फ़ोल्डर के अंदर से सभी "फाइल" को हटाने के लिए ( आंतरिक फ़ोल्डरों को नहीं हटाना ):

    rm -f /path/to/directory/{*,.*}
    


  • चेतावनी : यदि आपके रास्ते में जगह है, तो हमेशा उद्धरणों का उपयोग करना सुनिश्चित करें।

    rm -rf /path/to the/directory/*
    

    2 अलग rm -rfकॉल के बराबर है :

    rm -rf /path/to
    rm -rf the/directory/*
    

    इस समस्या से बचने के लिए, आप 'सिंगल-कोट्स '( शेल वेरिएबल्स का विस्तार नहीं करता है ) या "डबल-कोट्स "( शेल वेरिएबल का विस्तार ) का उपयोग कर सकते हैं :

    rm -rf "/path/to the/directory/"*
    


कहाँ पे:

  • rm- " हटाने " के लिए खड़ा है
  • -f- " बल " के लिए खड़ा है, जो तब मददगार होता है जब आप किसी संग्रह को हटाना चाहते हैं, उदाहरण के लिए पूछा जाना चाहिए / संकेत नहीं किया जाना चाहिए।
  • -r- " पुनरावर्ती " के लिए खड़ा है, जिसका अर्थ है कि आप हर फ़ोल्डर को पुनरावर्ती रूप से नीचे जाना चाहते हैं और सब कुछ हटा दें।

8
मैंने इसे उस उत्तर के ऊपर और अधिक व्यापक और सहायक उत्तर के रूप में पाया, जो स्वीकृत के रूप में चिह्नित किया गया था।
— प्रेरित

2
rm -rf /path/to/directory/*फ़ोल्डर में छिपी हुई फ़ाइल को नहीं हटाता है उदा .htaccess। हो सकता है rm -rf /path/to/directory/.? यह कोशिश नहीं की है।
— मार्क बेरी

@ मार्केरीम आरएम -आरएफ / पीपाट / आटो / परोक्ष /.आईएम
— ।

@ LilianA.Moraru, मैंने आज कुछ परीक्षण किया। rm -rf /path/to/directory/.*केवल निर्दिष्ट निर्देशिका में छिपी हुई फ़ाइल को हटाता है। @ रंजविंड के उत्तर पर @ danjjl की टिप्पणी को देखते हुए, छिपी हुई फ़ाइलों को हटाने के लिए, चलाने shopt -s dotglobसे पहले चलाएं rm -rf /path/to/directory/*।
— मार्क बेरी

चेतावनी: rm -rf /path/to/directory/.*पर अपने सिस्टम में आइटम का विलोपन के कारण होता है /path/to। सौभाग्य से, मैंने अपना संपूर्ण डेटा एक अलग डिस्क पर बैकअप कर दिया था। कहने की जरूरत नहीं है, rm -rf /path/to/directory/.*जब तक आप अपने पूरे कंप्यूटर को एक अलग / सुरक्षित स्थान पर बैकअप न लें, तब तक आदेश जारी न करें!
— बजे

43

निर्देशिका में सभी फ़ाइलों को हटाने के लिए (छुपी हुई फ़ाइलें और उपनिर्देशिका सहित) चलाएँ:

rm -rf /path/to/directory/{*,.*}

1
यह सुंदर स्वीकृत उत्तर होना चाहिए। धन्यवाद!
— नाम जी वीयू

3
यह ग्लोब मैच नहीं करता है "।" और भी?
— हर्ट्ज़स्प्रुंग

4
@hertzsprung - यह करता है, और यह आपको एक चेतावनी देगा कि यह हटा नहीं सकता है ./और ../, लेकिन यह अभी भी छिपी हुई फ़ाइलों को हटा देगा।
— रयान व्हीले

यह मैक कंसोल पर काम नहीं करता है, उस कमांड लाइन के साथ छिपी हुई फाइलें अभी भी हैं।
— अगपिटोकांडेमोर

वर्तमान निर्देशिका को हटाने के लिए:rm -r $(pwd)/{*,.*}
— जिमी एडारो

10

यदि आप केवल पथ / पथ / / निर्देशिका में फ़ाइलें हटाना चाहते हैं, तो आप कर सकते हैं

find /path/to/directory -type f -print0| xargs -0 rm 

या

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

आप के साथ लोड कर सकते हैं find, लाभ यह है कि आप सूचीबद्ध rmकर सकते हैं जो इसे पाइपिंग के बिना पाया जाता है ताकि आप देख सकें कि आपके शुरू होने से पहले क्या हटा दिया जाएगा।


2
GNU findएक -deleteविधेय के रूप में । आप अभी भी उपयोग करना चाहते हैं -exec, प्रतिस्थापन \;के साथ +इकट्ठा करेगा rmकॉल एक साथ, बढ़ती दक्षता।
— enzotib

1
'+' के साथ बड़ी मात्रा में फ़ाइलें समस्याएँ पैदा करेंगी, क्योंकि सूची बहुत बड़ी होगी, rm -f * के समान। और जब एक ही फ़ोल्डर से बड़ी मात्रा में फ़ाइलों को हटा रहे हैं (मिलन में बात कर रहे हैं) दोनों अच्छे नहीं हैं :) अंत में सी + + साथ आया और डीर-ट्री में इनोड्स के क्रम में फ़ाइलों को हटा दिया।
— Osis

3
आप वास्तव में rm के बाद a - जोड़ना चाहते हैं। इसके बिना यदि आपके पास कोई फ़ाइल नाम है -rf या समान है तो rm के तर्क के रूप में व्याख्या की जाएगी। जैसे xargs -0 rm - या -exec rm - {} \;
— रिचम

आप xargs को एन-एन तर्क भी प्रदान कर सकते हैं। यह rm कमांड को विभाजित करने का कारण बनेगा ताकि अधिक से अधिक संख्या में तर्क हो सके 'xargs -n 100 -0 rm -' 100 के
— चंक्स

1
आप यह सुनिश्चित करने के लिए भी जोड़ सकते हैं कि किसी भी उपनिर्देशिका से फ़ाइल वापस न करें। अर्थात् खोजें / पथ / से / निर्देशिका
— -maxdepth

7

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

  • फ़ोल्डर को हटाएं, फिर इसे फिर से बनाएँ

    rm -rf dir_name && mkdir dir_name
    
  • उपयोग find

    find dir_name -mindepth 1 -delete  
    

यहां हम -mindepth 1निर्देशिका dir_name को स्वयं निर्दिष्ट करना निर्दिष्ट करते हैं।
निम्नलिखित लिंक पर एक नज़र डालें:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


आपकी सलाह के लिए धन्यवाद और मैंने लिंक के लिए और स्पष्टीकरण जोड़ा है।
— zeekvfu 5

3
सावधान रहें, क्योंकि फ़ोल्डर को हटाने और फिर से बनाने से इस फ़ोल्डर के लिए अलग / गलत अनुमतियाँ हो सकती हैं!
— आइंजॉन

6

यदि आप भी सभी उपनिर्देशिका और निर्देशिका को स्वयं निकालना चाहते हैं, तो आप उपयोग कर सकते हैं rm -rf /path/to/directory। लेकिन हमेशा रिटर्न को दबाने से पहले अपनी लाइन को डबल-चेक करें, rm -rfबहुत सारे हॉक का कारण बन सकता है, जैसे कि अगर आपने गलती से सुपरसिर की अनुमति होने के बाद पहली स्लैश के बाद एक स्थान डाला है ...


1

चूँकि यह प्रश्न Google के शीर्ष पर है, जब मैं स्वयं इसे खोजता हूँ:

अन्य उत्तर विभिन्न समस्याओं से ग्रस्त हैं:

  1. उनमें से कुछ शामिल हैं .और ..जो शोर, भ्रमित और कष्टप्रद है।

  2. उनमें से कुछ छिपी हुई फाइलें (डॉट के साथ शुरू होने वाली फाइलें) भूल जाते हैं।

  3. वे निर्देशिका हटाने की अनुमति देने के लिए एक सही (सबसे गहरा-पहला) क्रम में नहीं हटाते हैं।

  4. वे अन्य (घुड़सवार) फ़ाइल सिस्टम में उतरते हैं, जो अक्सर अवांछित होता है।

  5. वे अतिरिक्त मापदंडों के साथ ठीक से विस्तार करना मुश्किल हैं (उस पर अधिक)।

इसलिए, एक निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों को पुनर्प्राप्त करने के लिए, यह करें:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

ध्यान दें कि मैंने -xdevआरोह (जैसे /procआदि) में उतरने से रोकने के लिए एक तर्क जोड़ा ।

क्यों -depthया नहीं -delete?

इसके बावजूद लोग लगातार मुझे इसके लिए मना कर रहे हैं, उन तरीकों में एक नकारात्मक पहलू है: ऐसा लगता नहीं है कि वे पर्याप्त रूप से -pruneएक उपनिर्देशिका (और अधिक समस्याओं को पेश किए बिना) को अनुमति देने के लिए पर्याप्त नहीं हैं । इस विधि के विपरीत, आप सम्मिलित कर सकते हैं

-not \( -path "${DIR}/subdir" -prune \)

अपनी सामग्री को हटाने से हटाने के -mindepthतर्क से पहले subdir।


और गहराई-पहले क्रम के लिए, इसमें एक -depthध्वज findहै।
— सर्गी कोलोडियाज़नी

उह ... क्यों नहीं बस के -deleteसाथfind उपयोग ? -deleteगहराई है-पहली। आप पहले से ही गैर POSIX संभालने रहे हैं findके साथ -printfहै, तो आप बस के रूप में अच्छी तरह से उपयोग कर सकते हैं -deleteया-depth -print0 | xargs -0 rm
— muru

@ ममरू: क्योंकि मैं बेहतर नहीं जानता था ... मैं इसे बदल दूँगा।
— मेहरदाद

@ मुरू: दरअसल, ऐसा लगता है कि आपका तरीका काम नहीं करता -not \( -path "$DIR/subdir" \)... लेकिन मेरा है? क्यों?
— मेहरदाद

@ मेहरदाद क्या करना चाहिए?
— मुरु

0

आप cdडायरेक्टरी में जा सकते हैं और फिर rm *.*डीओएस की तरह ही कमांड चला सकते हैं अगर आपको याद है।


1
DOS फाइलों के लिए DEL है और खाली निर्देशिकाओं के लिए RMDIR- और छिपी हुई और सिस्टम फ़ाइलों में पहले से हटाए गए ATTRIB गुण होने चाहिए। लगभग उतना सरल नहीं;)
— एरिक

0

वर्तमान निर्देशिका को हटाने के लिए, आप उदाहरण के लिए उपयोग कर सकते हैं rm -d ./*

-d निर्देशिकाओं को हटाने के लिए भी कहता है।

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