क्या rm खाली निर्देशिकाओं को पुन: हटा सकता है?


9

यूनिक्स के एक पुराने संस्करण में, rmयदि वे खाली थे , तो कमांड निर्देशिका को हटा देगा। अनुसंधान यूनिक्स आठवें संस्करण मैन पेज से rm के लिए : "यदि एक प्रविष्टि एक निर्देशिका है तो केवल खाली होने पर इसे हटा दिया जाता है।" मुझे यह व्यवहार पसंद है, इसलिए मुझे यह उपनाम मिला है /etc/profile: alias rm='rm -d'मैं GNU कोरुटिल्स संस्करण का उपयोग कर रहा हूं rm, जिसमें आगे जाने और निर्देशिका खाली होने पर निर्देशिकाओं को हटाने के लिए -dकहा rmगया है।

अब तक सब ठीक है। यह उपनाम मुझे rmपुराने दिनों की तरह उपयोग करने की अनुमति देता है । हालाँकि, मैं इसे एक कदम आगे ले जाना चाहूँगा। मुझे पसंद हैrmकिसी निर्देशिका को हटाने के लिए भले ही निर्देशिका में अन्य निर्देशिकाएँ हों, जब तक कि निर्देशिकाएं केवल एक ही चीज़ न हों। इससे कोई फर्क नहीं पड़ता कि निर्देशिका संरचना कितनी गहरी है, जब तक कि वहां कोई फाइल नहीं है, बस खाली (एक बार जब आप नीचे तक पहुंचते हैं) निर्देशिकाएं, मैं rmउन सभी को निकालना चाहूंगा ।

क्या यह एक उपनाम के रूप में लिखा जा सकता है जो अभी भी नियमित रूप से कार्य करेगा rmऔर इसके लिए पारित किसी भी फाइल को हटा देगा?


कैसे के बारे में rmdir -p?
केविन

सुझाव केविन के लिए धन्यवाद, लेकिन यह वह व्यवहार नहीं है जिसकी मुझे तलाश है। यदि मैं दौड़ता हूं mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;, तो मैं अभी भी ए, / बी 2, और ए / बी 2 / सी 2 के साथ बचा हुआ हूं। मैं जो चाहता हूं, वह सिर्फ शीर्ष स्तर (इस मामले में) को rmपास करना है , और इसके नीचे का सब कुछ हटा दिया है।
व्हाइटहोटलवेटिगर

जवाबों:


8

आप किसी निर्देशिका ट्री को ट्रेस करना चाहते हैं और यह देखना चाहते हैं कि इसमें निर्देशिका के अलावा कुछ और भी है या नहीं। यह rmक्षमताओं से परे है। आप इस तरह के रूप में अन्य उपकरणों की आवश्यकता find। आप किसी दिए गए निर्देशिका के तहत खाली निर्देशिकाओं को हटा सकते हैं ( -depthमाता-पिता की निर्देशिकाएं जो खाली होने के साथ-साथ नष्ट हो जाती हैं):

find "$x" -depth -type d -exec rmdir {} +

यहां एक फ़ंक्शन है जो प्रत्येक तर्क के लिए, तर्क को हटा देता है यदि यह एक गैर-निर्देशिका फ़ाइल या निर्देशिका ट्री है जिसमें निर्देशिकाओं के अलावा कुछ भी नहीं है। ध्यान दें कि यह फ़ंक्शन परमाणु नहीं है: यदि कोई तर्क चल रहा है, तो यह बदल जाता है, तो आप एक त्रुटि संदेश के साथ समाप्त हो सकते हैं, लेकिन यह सुरक्षित है कि यह तर्क के रूप में पारित किसी निर्देशिका के अंदर किसी गैर-निर्देशिका को हटा नहीं देगा।

rm () {
  ret=0
  for x; do
    case $x in -*) x=./$x;; esac
    if [ -d "$x" ]; then
      if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
        echo 1>&2 "$x: non-empty directory tree"
        ret=2
      else
        find "$x" -depth -exec rmdir {} +
        if [ -d "$x" ]; then ret=2; fi
      fi
    else
      command rm "$x" || [ $ret -gt 1 ] || ret=2
    fi
  done
  return $ret
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.