मैं कमांड लाइन से एक निर्देशिका में सभी खाली निर्देशिकाओं को कैसे हटाऊं?


58

कहो कि मेरे पास एक निर्देशिका है जिसका नाम है foo/। इस फ़ोल्डर में उपनिर्देशिकाएँ शामिल हैं। मैं एक कमांड में सभी खाली निर्देशिकाओं को कैसे हटा सकता हूं?

जवाबों:


119

इस आदेश का प्रयास करें:

find . -empty -type d -delete

findआदेश के लिए फ़ाइलें / निर्दिष्ट पथ से एक विशेष खोज मापदंड से मेल खाने निर्देशिका खोज करने के लिए, इस मामले में वर्तमान निर्देशिका (इसलिए प्रयोग किया जाता है .)।

-emptyविकल्प किसी भी फाइल और निर्देशिका है कि खाली है के लिए सच है।

-type dविकल्प के लिए सच है फ़ाइल निर्दिष्ट प्रकार; इस मामले dमें फ़ाइल प्रकार निर्देशिका के लिए खड़ा है ।

-deleteविकल्प प्रदर्शन करने के लिए कार्रवाई है, और खोज में पाया सभी फ़ाइलों के लिए सच है।


मुझे लगता है कि ऐसा करने का यह सबसे आसान तरीका है इसलिए मैं आगे बढ़ने जा रहा हूं और इसका उत्तर दिया जा रहा हूं।
जस्टिंगप्रिट

हे बिल, मैंने एक और अनौपचारिक प्रश्न पोस्ट करने की कोशिश की और यह मुझे नहीं होने देगा क्योंकि यह कहा गया कि यह एक ठग था, इसलिए मैं उम्मीद कर रहा था कि आप मुझे यहाँ जवाब देने में सक्षम हो सकते हैं। कहें कि मैं ऊपर जैसा काम करना चाहता था, लेकिन सभी निर्देशिकाओं को हटा दें कि वे खाली हैं या नहीं।
बस

3
जिस तरह से आप निर्देशिका को दूर होता है, या नहीं, वे खाली हैं की परवाह किए बिना, निम्न लिखें आदेश: rm -rf <directory-name>। यह निर्देशिका को फ़ाइलों और उपनिर्देशिकाओं सहित इसकी सभी सामग्रियों के साथ हटा देगा। -rविकल्प रिकर्सिवली हटा सकते हैं, जबकि इसका मतलब -fआदेश साधन को हटाने से पहले संकेत न करें। यदि आप निर्देशिका / फ़ाइल को हटाने से पहले संकेत दिया जाना चाहते हैं, तो -fविकल्प के साथ विकल्प को बदलें -i
बिल

क्या होगा अगर उक्त निर्देशिका में कुछ फाइलें थीं जिन्हें मैं रखना चाहता था। इसलिए, मैं सभी निर्देशिकाओं को / foo / bar / में हटाना चाहता था, लेकिन ऐसी कोई भी फ़ाइल रख सकता हूँ जो वहाँ हो।
justingrif

2
stdoutएक कमांड (उदाहरण find) को stdinदूसरे में (जैसे rm) फ़ीड करने के लिए पाइप का उपयोग करके ऐसा करना संभव है , हालांकि, बहुत सावधान रहें क्योंकि यह फ़ाइलों / निर्देशिकाओं को मिटा सकता है या हटा सकता है जो आप नहीं चाहते हैं हटाना! ऐसा कैसे करें के बारे में अधिक जानकारी के manलिए, इनमें से प्रत्येक आदेश के लिए पृष्ठ देखें । सुरक्षित होने के लिए, वास्तविक चीज़ पर प्रयास करने से पहले हमेशा अस्थायी निर्देशिका में ऐसी चीज़ों का परीक्षण करें।
बिल

11

आप rmdirगैर-रिक्त निर्देशिकाओं को हटाने के लिए कमांड के इनकार का लाभ उठा सकते हैं , और find -depthनिर्देशिका ट्री तल-अप को पार करने का विकल्प:

find . -depth -exec rmdir {} \;  

(और त्रुटियों को अनदेखा करें), या 2>/dev/nullउन्हें वास्तव में अनदेखा करने की अपील करें।

डायरेक्टरी ट्री के निचले भाग में खोज शुरू -depthकरने का विकल्प find

rm -rfनिर्देशिका (और उसके उपनिर्देशिका, और ....) और सभी निर्देशिकाओं और सब कुछ में सभी फ़ाइलों को हटा देगा ।


8
rmdir *

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

rmdir * 2> /dev/null

यह स्क्रिप्टिंग के लिए उपयुक्त नहीं है क्योंकि यह एक गैर-शून्य स्थिति कोड के साथ बाहर निकल जाएगा, लेकिन यह काम करता है।
the_drow

@the_drow कैसे अनुपयुक्त बनाता है? वैसे आप भी इस्तेमाल कर सकते हैं rmdir * 2>/dev/null || true। ( खोज (1) तरीका पटकथा के लिए लेकिन अन्य कारणों से बेहतर है: क्योंकि यह बेहतर व्यक्त करता है कि आप क्या करना चाहते हैं।)
अलोइस महदाल

मैं अक्सर ऐसा करता हूं $HOME। एक दुष्ट मुस्कराहट के साथ।
एलोइस महदाल

क्योंकि यह विफलता की रिपोर्ट करेगा यदि निर्देशिका में से कुछ खाली नहीं हैं।
the_drow

क्या यह खोज विधि से अधिक तेज़ है? क्या किसी ने दोनों की तुलना की है?
ज़ेरुस

1
find . -type d -empty -delete -maxdepth 1

यदि आप केवल प्रत्यक्ष उपनिर्देशिका को हटाना चाहते हैं foo/


0

अजगर दृष्टिकोण

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

यह इस तरह काम करता है:

  • हम os.walk()पुनरावर्ती निर्देशिका ट्री को चलने के लिए फ़ंक्शन का उपयोग करते हैं। प्रत्येक पुनरावृत्ति rचालू फ़ोल्डर पर सेट की जाती है जिसे हम एक्सेस कर रहे हैं, sजिसमें निर्देशिकाओं की सूची शामिल है r, और fउस फ़ोल्डर में फ़ाइलों की सूची होगी। बेशक अगर fऔर sखाली हैं, तो हम जानते हैं कि rखाली है।
  • पहली सूची-समझ हमें emptyऊपर बताए गए मूल्यांकन के आधार पर, सभी निर्देशिकाओं की सूची तैयार करने की अनुमति देती है ।
  • दूसरा फ़ंक्शन, सूची में प्रत्येक आइटम पर map()प्रदर्शन करने के लिए उपयोग किया जाता है । सूची की समझ का उपयोग वैकल्पिक के रूप में भी किया जा सकता है।os.rmdir()empty

स्क्रिप्ट के रूप में यह इस प्रकार होगा:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

बहुत ही जटिल सवालों के जवाब के लिए :(
Nurulhudamustaqim

@nurulhudamustaqim देखने के बिंदु पर निर्भर करता है। बहुत सारे लिनक्स उपयोगकर्ताओं के लिए जो पायथन के लिए उपयोग किए जाते हैं यह वास्तव में बहुत मामूली है :) और इसके अलावा भी। आधुनिक प्रणाली प्रशासन /bin/shकेवल बैश या केवल तक ही सीमित नहीं है और पायथन वास्तव में उन दो की तुलना में अधिक सुंदर भाषा है
सेर्गेई कोलोडियाज़नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.