खाली निर्देशिका पेड़ निकालें (जितनी संभव हो उतनी निर्देशिकाओं को हटाएं लेकिन कोई फ़ाइल नहीं)


13

मान लीजिए कि मेरे पास इस तरह एक dir पेड़ है:

ROOTDIR
    └--SUBDIR1
        └----SUBDIR2
            └----SUBDIR3

मैं एक कमांड की तलाश कर रहा हूं, जब मैं इनपुट करता हूं:

$ [unknown command] ROOTDIR

अगर फ़ाइल नहीं है, लेकिन पूरे पेड़ के अंदर केवल डायर है तो पूरे डायर के पेड़ को हटाया जा सकता है । हालाँकि, यह कहें कि SUBDIR1 के अंतर्गत एक फाइल है जिसका नाम है hello.pdf:

ROOTDIR
    └--SUBDIR1
        └--hello.pdf
        └----SUBDIR2
            └----SUBDIR3

तब कमांड को केवल SUBDIR2 और नीचे हटाना चाहिए।


जवाबों:


11

एलेक्सिस करीब है। आपको यह करने की आवश्यकता है:

find . -type d -depth -empty -exec rmdir "{}" \;

वह पहले निर्देशिका ट्री को तब तक ड्रिल करेगा, जब तक कि उसे पहली खाली निर्देशिका नहीं मिल जाती, फिर उसे हटा दें। इस प्रकार मूल निर्देशिका को खाली कर दिया जाएगा, जिसे बाद में हटा दिया जाएगा, आदि। यह वांछित प्रभाव उत्पन्न करेगा (मैं ऐसा सप्ताह में 10 बार करता हूं, इसलिए मुझे पूरा यकीन है कि यह सही है)। :-)


-depthविकल्प क्यों आवश्यक है? find . -type d -empty -exec rmdir "{}" \;काम भी करना चाहिए .... सही?
अभिषेक ए

4
विचार करें कि क्या आपके पास एक पेड़ है (केवल निर्देशिकाएं) foo/bar/baz। जब तक आप उपयोग नहीं करते हैं -depth, तब तक यह fooपहले हटाने की कोशिश करेगा , असफल होगा, और foo/barदौड़ने के बाद आप समाप्त हो जाएंगे ।
14:01 पर l0b0

1
संभवतः विकल्प के +बजाय उपयोग करने के लिए है ;ताकि आप निर्देशिकाओं को हटा दें। चूंकि आप इसे गहराई से कर रहे हैं-पहले बच्चे अभी भी माता-पिता (संभवतः rmdir / bash के आपके संस्करण पर निर्भर करते हैं और rmdir पर निर्भर हैं जो गैर-रिक्त निर्देशिका नहीं हटा रहे हैं) से पहले हटा दिए जाएंगे। यह मेरे लिए mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
साइबरविन

4
लोग, नीचे जाने के लिए go2null के बहुत अधिक रसीले जवाब के लिए जाते हैं! समझ नहीं आ रहा है कि एसई प्रश्न के नीचे के उत्तर प्रदर्शित करने में सबसे अधिक उत्थान के साथ उत्तर के बजाय स्वीकृत उत्तरों को प्राथमिकता क्यों देता है। ओपी अपने चयन के समय उपलब्ध सर्वोत्तम उत्तर को स्वीकार करता है, लेकिन बाद में बहुत बेहतर उत्तर आ सकता है, जो समुदाय को प्रभावित करता है, नहीं? (ज़ाहिर है, यह मेटा के लिए कुछ है ...)
जमदग्नि

यह मेरे लिए काम नहीं करता है। यह केवल सबसे गहरी पत्ती को हटाता है (SUBDIR3 इस मामले में)
जॉय बरुच

24
find ROOTDIR -type d -empty -delete

के समान

find ROOTDIR -type d -depth -empty -exec rmdir "{}" \;

लेकिन अंतर्निहित "-डेलीट" कार्रवाई का उपयोग करता है।

ध्यान दें कि "-पेट" का अर्थ है "-depth"।


अपने स्वयं के निर्मित हटाएं का उपयोग करके सबसे रसीले उत्तर के लिए यश! मैं इसे अपने स्थानीय बर्तनों में जोड़ रहा हूँ!
जमदग्नि


1

इससे पहले कि हम इसे सुरक्षित रूप से कर सकें, कुछ आवश्यकताएं हैं:

  1. पहले उपनिर्देशिका निकालें और फिर ऊपरी स्तर की निर्देशिकाएं, यानी हमें निर्देशिका सूची को क्रमबद्ध करने या rmdir --parents ध्वज का उपयोग करने की आवश्यकता है
  2. ROOTDIR को हमेशा शुरुआत के साथ / या ./ के साथ शुरू करने से बचें -
  3. रिक्त स्थान के साथ निर्देशिका नामों के साथ काम करने के लिए निर्देशिकाओं की NUL समाप्त सूची का उपयोग करें

यहाँ बताया गया है कि मैं शेल में क्या करूँगा:

find ./ROOTDIR -type d | sort -r | tr '\n' '\000' | xargs -0 rmdir --ignore-fail-on-non-empty

यदि आप कुछ अनावश्यक त्रुटियों को बुरा नहीं मानते हैं, तो आप बस माता-पिता के साथ सभी निर्देशिकाओं को हटाने के लिए बाध्य कर सकते हैं और आपको किसी भी प्रकार की छंटनी करने की आवश्यकता नहीं है (आप एनयूएल समाप्त स्ट्रिंग्स को सॉर्ट नहीं कर सकते हैं जो कि ट्र को जोड़ने की आवश्यकता है)

find ./ROOTDIR -type d -print0 | xargs -0 rmdir --ignore-fail-on-non-empty --parents

आपके उत्तर की विस्तृत व्याख्या के लिए यश। मैंने शायद उसी दृष्टिकोण का उपयोग किया होगा, जब तक कि मुझे @ go2null के उत्तर के -empty -deleteविकल्पों के बारे में पता नहीं चला find
क्यूबेरिक जूल

0
rmdir $(find ROOTDIR -type d | sort -r)

5
यदि निर्देशिका के किसी भी नाम में व्हॉट्सएप या ग्लोबिंग अक्षर हैं तो यह काम नहीं करेगा। आमतौर पर फ़ाइल नामों की सूची में कमांड प्रतिस्थापन का उपयोग करना एक बुरा विचार है। यह विशेष रूप से एक बुरा विचार है findक्योंकि findप्रसंस्करण को सफाई से करने का एक तरीका है find … -exec:।
गाइल्स का SO- बुराई से दूर रहना '

इशारा करने के लिए गाइल्स का धन्यवाद। @lanzz, आमतौर पर यह बताए बिना कि यह क्या करता है (और इस मामले में, नुकसान) पर्याप्त नहीं है। कृपया अपने उत्तर में जोड़ें।
3:00 बजे n0pe

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