कहो कि मेरे पास एक निर्देशिका है जिसका नाम है 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
केवल बैश या केवल तक ही सीमित नहीं है और पायथन वास्तव में उन दो की तुलना में अधिक सुंदर भाषा है