कैसे निर्देशिका में सभी फ़ाइलों और उपनिर्देशिकाओं को हटाने के बिना निर्देशिका में बैश को हटाने के लिए?


53

क्या निर्देशिका को हटाने के बिना एक निर्देशिका में सभी फ़ाइलों और उपनिर्देशिकाओं को हटाने का आदेश है?

उदाहरण के लिए यदि मेरे पास उपनिर्देशिका "1", "2", "3" के साथ निर्देशिका "NOTDeleteMe" है और प्रत्येक उपनिर्देशिका में कुछ चित्र हैं, तो मैं उपनिर्देशिका "1", "2" और "3" को कैसे हटा सकता हूं। और माता-पिता निर्देशिका "NOTDeleteMe" को हटाने के बिना उन में सभी फाइलें?

जवाबों:


66

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

rm -rfv dontDeleteMe/*

कृपया ध्यान दें, /*भाग बहुत महत्वपूर्ण है। यदि आप पहले एक स्थान रखते हैं *, तो यह आपकी सभी फाइलों को आपकी वर्तमान निर्देशिका में हटा देगा।

इसके अलावा, के साथ खेल बहुत सावधान रहना होगा rm, -rऔर *एक ही आदेश में सभी। वे एक विनाशकारी संयोजन हो सकते हैं।

अपडेट: ठीक है, मुझे एहसास हुआ कि अगर आपके पास छुपी हुई / डॉट फाइलें हैं [शुरुआत में डॉट्स के साथ फाइलनेम, पूर्व .hidden] तो यह उन फाइलों को बरकरार रखेगा।

तो वास्तव में, मूल प्रश्न का सबसे सरल समाधान है: rm -rfv dontDeleteMe && mkdir dontDeleteMe

एक और एक का उपयोग किया जाएगा findके -execलिए विकल्प या पाइप xargs(नीचे):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


क्या आप xargs का उपयोग करने का एक उदाहरण दे सकते हैं? Xargs क्या है?
justingrif

@ अन्यायपूर्ण: find dontDeleteMe/* -print0 | xargs -0 rm -rv मेरा मानना ​​है कि ज्यादातर मामलों में यह काम करेगा, चाहे वे रिक्त स्थान हों, और क्या नहीं। लेकिन /tmp/एक परीक्षण निर्देशिका बनाने के लिए सीडी और इसे आज़माएं। :)
मैट

ओह, और मैनपेज से: "xargs - मानक इनपुट से कमांड लाइनों का निर्माण और निष्पादित करें"
मैट

5
एक निर्देशिका को फिर से बनाने से इसकी सामग्री को हटाने के बराबर नहीं है। जैसे umask निर्देशिका अनुमति अंतर, स्वामी अंतर, आदि ... enzotib का उत्तर आपके मूल सिंटैक्स के साथ समस्याओं को हल करेगा

3
यह एक अच्छा जवाब नहीं है। * का उपयोग करना खतरनाक है, और "डॉटग्लोब" के बिना डॉटफ़ाइल्स पर काम नहीं करेगा (नीचे देखें)। rm -rf dontDeleteMe && mkdir dontDeleteMeयह सुनिश्चित नहीं करता है कि dir समान अनुमतियों / स्वामी (ओं) के साथ फिर से बनाया गया है। इसके बजाय, find dontDeleteMe/ -mindepth 1 -deleteनीचे दिए गए किसी एक संस्करण का उपयोग करें।
निल्स टेड्टमैन

27

एकमात्र कारण rm -r ./*हमेशा काम नहीं करता है क्योंकि आपके पास छिपी हुई फाइलें और / या फ़ोल्डर हो सकते हैं जो मेल नहीं खाते हैं *

यह अंत bashकरने के लिए *, सब कुछ मैच के लिए एक विकल्प प्रदान करें , यहां तक ​​कि छिपी हुई वस्तुएं:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglobयदि आप ऊपर दिए गए कमांड को निष्पादित करते हैं तो शेल का उपयोग करते रहने पर इसकी डिफ़ॉल्ट (परेशान) स्थिति पर रीसेट करने के लिए उपयोगी हो सकता है :

shopt -u dotglob 

जब आपके पास बड़ी संख्या में फाइलें नहीं हैं तो यह भी काम नहीं कर सकता है
S ..

23

टर्मिनल खोलें ( Ctrl+ Alt+ T) इस प्रकार:

find somedir -mindepth 1 -delete

यह सभी फाइलों और निर्देशिकाओं के भीतर somedirऔर उसके (भव्य) "छुपा" डॉट फ़ाइलों सहित बच्चों से मेल खाएगा, लेकिन इसके बाद somedirखुद को छोड़कर -mindepth 1, फिर -deleteउन्हें।


AskUbuntu में आपका स्वागत है! जबकि आपका उत्तर संभावित रूप से मूल पोस्टर की मदद कर सकता है, जानकारी की कमी यह समझाने के लिए कि यह उसकी मदद करने के लिए क्या करेगा / उसे आपके उत्तर को अधूरा बनाता है।
ओयोबो

3
स्पष्टीकरण की कमी है, लेकिन अभी भी सबसे अच्छा जवाब है। ओएसएक्स में भी काम करता है (टर्मिनल खोलने के तरीके को छोड़कर, बिल्कुल)।
दोपहर

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

xdevकेवल डिवाइस सीमा के भीतर फ़ाइलों को हटाने के लिए विकल्प का उपयोग करें ।


जीएनयू खोज है -delete। इसका तात्पर्य यह है -depthकि याद रखना आसान है-depth -exec rm -Rf {} \;
निल्स टेड्टमैन

4

आधारभूत निर्देशिका को छोड़कर सभी फ़ाइलों और उप-श्रेणियों ("टर्मिनल") को हटाने के लिए जिसका नाम "डोनडेट" है।

rm -rf dontdelete/*

यह छिपी हुई फ़ाइलों को नष्ट नहीं करता है, इसलिए "सभी फाइलें" एक बयान में बहुत अधिक बोल्ड हो सकती हैं।
स्टेफन वैन डेन अककर

4

आप ध्वज के findसाथ उपयोग कर सकते हैं -delete:

find dontDeleteMe/* -delete

यह /*महत्वपूर्ण है क्योंकि यह findकेवल "INSDIDEMe" नामक फ़ोल्डर को खोजने के लिए कहता है।

यह भी सुनिश्चित करें कि -deleteध्वज findकमांड के अंत में है ।


1
जब तक आप सक्षम नहीं करते यह समाधान किसी भी छिपी हुई फाइल को नहीं हटाता है dotglob। अन्यथा, -mindepth 1ध्वज विकल्प का उपयोग करना इसे काम करने का एकमात्र तरीका लगता है।
स्टेफन वैन डेन अककर

3
rm -rf  directory/{.*,/*}

क्या कहते हो:

से शुरू होने वाली सभी फाइलों को हटा दें। "निर्देशिका" और अन्य सभी फाइलों में भी।

यद्यपि नेफ्टस द्वारा कृपया उल्लेख किया गया है कि यह समाधान सुरक्षित नहीं है!

सुरक्षित समाधान है:

 rm -rf directory/!(.|..)

यह आदेश संभावित रूप से खतरनाक हो सकता है, क्योंकि आप भी इसमें शामिल हैं .और ..निर्देशिकाएं हैं। इसे बदलने {.*}से बचा जा सकता है {.??*}, लेकिन फिर आप केवल एक ही चरित्र के साथ छिपी हुई फ़ाइलों को नहीं हटाएंगे, जैसे कि .a
स्टेफन वैन डेन अककर

इसका क्या? rm -rf निर्देशिका / (! | ..)
Tebe

कि मैं क्या के साथ आया था की तुलना में एक बेहतर समाधान की तरह लग रहा है क्या मैं आपको अपना उत्तर संपादित करने का सुझाव दूंगा?
स्टेफन वैन डेन अककर

सुझाव स्वीकार किया गया)
तेबे

1

मुझे यकीन नहीं है कि यह इतना जटिल क्यों है, अगर मैं गलत हूं तो मेरी मदद करें

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

बस


यह वर्तमान निर्देशिका को हटाने की कोशिश करने का मामूली दोष है, जो निश्चित रूप से, काम नहीं करता है, क्योंकि यह अभी भी उपयोग करने वाले शेल की कार्यशील निर्देशिका के रूप में उपयोग में है।
डेविड फ़ॉस्टर

1

एक और भी सरल उत्तर है:

  1. cd dontDeleteMe

  2. rm -rf *

बेसिक सिस्टम एडमिनिस्ट्रेशन लेक्चर का समय: इस बात पर ध्यान देना सुनिश्चित करें कि जब आप स्वीपिंग कमांड्स का उपयोग करते हैं तो आप कहां हैं।

मैं इतना नहीं कह सकता। मुझे एक बॉक्स को पुनर्प्राप्त करना पड़ा है क्योंकि कोई ध्यान नहीं दे रहा था और rm -rf *में / में टाइप किया गया था ।

* निक्स यह मानता है कि यदि आप जड़ हैं या यदि आप जड़ के रूप में सूद-इंग हैं तो आप जानते हैं कि आप क्या कर रहे हैं। इसलिए सुनिश्चित करें कि आप जानते हैं कि आप इसे करने से पहले क्या कर रहे हैं।

एक विकल्प जो सुनिश्चित करता है कि 'rm' का उपयोग करने से पहले आपकी 'cd' कमांड काम करती है

cd dontDeleteMe && rm -rf *

6
यह एक खतरनाक सुझाव है। आप क्या चाहते हैं: cd dontDeleteMe && rm -rf *
इजाका

@ इज़काटा या आरएम कमांड जारी करने से पहले यह सुनिश्चित करना सुनिश्चित करें कि सीडी ऑपरेशन सफल रहा।
एलियाह कगन

1
@EliahKagan यह वही है जो मेरा कोड स्निपेट करता है ...
इज़्काता

वास्तव में यह आपके सुझाव से ज्यादा खतरनाक या कोई कम खतरनाक नहीं है। सभी && दो आदेशों को एक साथ श्रृंखलाबद्ध करना है ताकि वे एक ही समय में निष्पादित हों। अगर कुछ भी मेरी विधि वास्तव में SAFER है क्योंकि आपको rm -rf * निष्पादित करने से पहले रोकना और अनदेखा करना है। डबल चेक को रोकना हमेशा बेहतर होता है।
user30619

5
@ user30619 &&ऑपरेटर केवल एक साथ कमांड को चेन नहीं करता है; यह आवश्यक है कि प्रत्येक कमांड को अगले एक को निष्पादित करने से पहले सफल होना चाहिए। यदि cdकिसी कारण से कमांड विफल हो जाती है (निर्देशिका मौजूद नहीं है, विशेषाधिकारों आदि) तो rmकमांड निष्पादित नहीं किया जाएगा। मैं उस सुरक्षित को फोन करूंगा।
.555533

0
  1. मेरे लिए सबसे आसान बात - एक विंडोज़ विशेषज्ञ लेकिन एक ubuntu नौसिखिया
  2. लांचर पर फ़ाइलें आइकन पर क्लिक करें
  3. उस डायरेक्टरी पर नेविगेट करें जहाँ उन फाइल्स और फोल्डर को स्थित किया गया है जिन्हें आप हटाना चाहते हैं
  4. फ़ाइलों के बगल में खिड़की के एक खाली क्षेत्र में राइट क्लिक करें और "टर्मिनल में खोलें" पर क्लिक करें - फ़ाइलें विंडो को खुला छोड़ दें
  5. एक टर्मिनल विंडो खुलेगी और आपके द्वारा स्थित फ़ोल्डर में "सेट" हो जाएगी
  6. आप "dir" टाइप कर सकते हैं (जब मैं बोलता हूं तो अवहेलना करें) और टर्मिनल के लिए फाइल और फ़ोल्डरों की सूची दिखाने के लिए एन्टर प्रेस करें - सिर्फ यह साबित करने के लिए कि आप सही फ़ोल्डर में हैं
  7. टाइप करें "rm -rf *" और एंटर दबाएं
  8. सिस्टम को हटाने के लिए फ़ोल्डर / फ़ाइलों के आकार पर निर्भर करता है
  9. जब टर्मिनल प्रॉम्प्ट देता है, तो आपके द्वारा खोली गई फ़ाइल विंडो अब कहेगी "फ़ोल्डर खाली है"
  10. मुझे इस पद्धति से सफलता मिली और इसने मुझे फाइल विंडो में फाइल / फोल्डर को देखने के लिए आराम दिया और टर्मिनल विंडो में डीआर कमांड के परिणामस्वरूप
  11. मुझे यह भी तसल्ली हुई कि फ़ाइलें विंडो ने अब फ़ोल्डर खाली दिखा दिया है - विशेषकर जब से मैं इन फ़ाइलों का पीछा कर रहा था, वे उस ट्रैश फ़ोल्डर की तलाश में थे जो वे अंदर थे
  12. बाकी सभी को धन्यवाद जिन्होंने जवाब प्रस्तुत किया - यह बहुत जानकारीपूर्ण था

यह काफी जटिल लगता है - खासकर जब से आप rm -rf *वैसे भी चल रहे हैं।
डेविड फोस्टर

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