कहो कि मेरे पास एक निर्देशिका है जिसका नाम है foo/। इस फ़ोल्डर में उपनिर्देशिकाएँ शामिल हैं। मैं एक कमांड में सभी खाली निर्देशिकाओं को कैसे हटा सकता हूं?
कहो कि मेरे पास एक निर्देशिका है जिसका नाम है foo/। इस फ़ोल्डर में उपनिर्देशिकाएँ शामिल हैं। मैं एक कमांड में सभी खाली निर्देशिकाओं को कैसे हटा सकता हूं?
जवाबों:
इस आदेश का प्रयास करें:
find . -empty -type d -delete
findआदेश के लिए फ़ाइलें / निर्दिष्ट पथ से एक विशेष खोज मापदंड से मेल खाने निर्देशिका खोज करने के लिए, इस मामले में वर्तमान निर्देशिका (इसलिए प्रयोग किया जाता है .)।
-emptyविकल्प किसी भी फाइल और निर्देशिका है कि खाली है के लिए सच है।
-type dविकल्प के लिए सच है फ़ाइल निर्दिष्ट प्रकार; इस मामले dमें फ़ाइल प्रकार निर्देशिका के लिए खड़ा है ।
-deleteविकल्प प्रदर्शन करने के लिए कार्रवाई है, और खोज में पाया सभी फ़ाइलों के लिए सच है।
rm -rf <directory-name>। यह निर्देशिका को फ़ाइलों और उपनिर्देशिकाओं सहित इसकी सभी सामग्रियों के साथ हटा देगा। -rविकल्प रिकर्सिवली हटा सकते हैं, जबकि इसका मतलब -fआदेश साधन को हटाने से पहले संकेत न करें। यदि आप निर्देशिका / फ़ाइल को हटाने से पहले संकेत दिया जाना चाहते हैं, तो -fविकल्प के साथ विकल्प को बदलें -i।
stdoutएक कमांड (उदाहरण find) को stdinदूसरे में (जैसे rm) फ़ीड करने के लिए पाइप का उपयोग करके ऐसा करना संभव है , हालांकि, बहुत सावधान रहें क्योंकि यह फ़ाइलों / निर्देशिकाओं को मिटा सकता है या हटा सकता है जो आप नहीं चाहते हैं हटाना! ऐसा कैसे करें के बारे में अधिक जानकारी के manलिए, इनमें से प्रत्येक आदेश के लिए पृष्ठ देखें । सुरक्षित होने के लिए, वास्तविक चीज़ पर प्रयास करने से पहले हमेशा अस्थायी निर्देशिका में ऐसी चीज़ों का परीक्षण करें।
आप rmdirगैर-रिक्त निर्देशिकाओं को हटाने के लिए कमांड के इनकार का लाभ उठा सकते हैं , और find -depthनिर्देशिका ट्री तल-अप को पार करने का विकल्प:
find . -depth -exec rmdir {} \;
(और त्रुटियों को अनदेखा करें), या 2>/dev/nullउन्हें वास्तव में अनदेखा करने की अपील करें।
डायरेक्टरी ट्री के निचले भाग में खोज शुरू -depthकरने का विकल्प find।
rm -rfनिर्देशिका (और उसके उपनिर्देशिका, और ....) और सभी निर्देशिकाओं और सब कुछ में सभी फ़ाइलों को हटा देगा ।
rmdir *
सभी खाली निर्देशिकाओं को हटा देगा। यह हर गैर-खाली निर्देशिका और फ़ाइल के लिए एक त्रुटि को फेंक देगा, उन त्रुटियों को अपने टर्मिनल को अव्यवस्थित करने से रोकने के लिए, उपयोग करें
rmdir * 2> /dev/null
rmdir * 2>/dev/null || true। ( खोज (1) तरीका पटकथा के लिए लेकिन अन्य कारणों से बेहतर है: क्योंकि यह बेहतर व्यक्त करता है कि आप क्या करना चाहते हैं।)
$HOME। एक दुष्ट मुस्कराहट के साथ।
$ 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)
/bin/shकेवल बैश या केवल तक ही सीमित नहीं है और पायथन वास्तव में उन दो की तुलना में अधिक सुंदर भाषा है