खाली सबफ़ोल्डर हटाएं, पैरेंट फ़ोल्डर रखें


15

जब मैं उपयोग करता हूं

find /home/user/parentdir -type d -empty -delete

यह अंदर के खाली सबफ़ोल्डर के लिए पुनरावर्ती दिखता है /home/user/parentdirऔर उन्हें हटा देता है। लेकिन अगर /home/user/parentdirयह भी खाली है, तो यह parentdirफ़ोल्डर को भी हटा देता है, जो मेरे लिए अवांछनीय है।

मैं इस रखना चाहते हैं parentdirके लिए rsyncबैकअप या बादल के लिए कुछ फ़ाइलें। प्रसंस्करण के बाद, मुझे खाली फ़ोल्डर्स को हटाने की आवश्यकता है, लेकिन parentdirहर बार फिर से बनाने के लिए अनुत्पादक लगता है ।

कोई सुझाव रखने के लिए parentdir? मैंने .nocopyइसके अंदर एक फ़ाइल बनाने और इसे से बाहर करने के बारे में सोचा rsync, लेकिन ओवरकिल जैसा दिखता है। वहाँ एक और अधिक सुंदर तरीका है?


अगर आप एक आगे की स्लैश / / के अंत में / parentdir जोड़ते हैं (यानी / parentdir /) क्या इससे कोई फर्क पड़ता है?
ग्राहम

6
-mindepth 1?
इस्पात

@ ग्राहम / माता-पिता / माता-पिता को भी हटा देता है, इसलिए कोई फर्क नहीं पड़ता।
टीएनटी

आह, मुझे लगता है मैं याद किया * अंत में जो @Amourk अपने जवाब में उल्लेख किया है।
ग्राहम

जवाबों:


25

बस करो find /home/user/parentdir -mindepth 1 -type d -empty -delete

देखो:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/* AmourK के जवाब में जब वहाँ फ़ाइलों का एक बहुत होते हैं और यह overcomplicated है अवांछनीय है।


15

/*के अंत में जोड़कर parentdir, आप parentdirस्वयं के बजाय पैरोडिर के सभी उपखंडों पर कार्रवाई कर रहे हैं । और इसी तरह /home/user/पुराने कमांड parentdirमें डिलीट नहीं किया जाता है, तो नीचे कमांड में डिलीट नहीं किया जाएगा। *एक ग्लोब ऑपरेटर कहा जाता है और यह किसी भी अक्षर के तार से मेल खाता है।

find /home/user/parentdir/* -type d -empty -delete


7
इस दृष्टिकोण से अवगत होने के लिए एक बात यह है कि यदि बड़ी संख्या में फाइलें हैं /home/user/parentdir/, तो विस्तारित ग्लोब अधिक हो सकता है ARG_MAX, जिसके परिणामस्वरूप तर्क सूची बहुत लंबी त्रुटि हो सकती है। आप ग्लोब को बदलकर ऐसा होने की संभावना को कम कर सकते हैं */ताकि यह केवल निर्देशिकाओं से मेल खाए।
स्टीलड्राइवर

12
यह भी सावधान रहें कि यह डॉट के साथ शुरू होने वाले किसी भी बच्चे को नहीं मिलेगा। और किसी दिन आपको इसका एहसास होगा, और अगर आप "। *" के लिए एक खोज भी करते हैं, तो आप चोट की एक विशाल दुनिया में होंगे (क्योंकि "*।" "मैच" .. ")। मुझे कैसे पता है मुझसे पूछो।
ग्लेन विलेन

1
@GlennWillen मुझे क्यों लगता है कि इस कहानी को बताने से पहले हमें हमारे सामने पेय के साथ एक बार में बैठना चाहिए?
मोंटी हार्डर

@ मेन्टीहार्डर सौभाग्य से उतना बुरा नहीं था जितना कि यह हो सकता था। यह मेरी पहली यूनिक्स प्रणाली पर था, जो मेरे हाई स्कूल के स्वामित्व वाली सोलारिस मशीन थी। भगवान का शुक्र है कि मैं 'rm' नहीं चला रहा था, बल्कि 'chown' था। मैं अपने घर निर्देशिका में सब कुछ के स्वामित्व को ठीक करने की कोशिश करने के लिए रूट का उपयोग कर रहा था। इसके बजाय मैंने अपने आप को हर घर निर्देशिका (और उनकी सभी सामग्री) का स्वामित्व दिया और फिर उन्हें वापस लाना पड़ा।
ग्लेन विलेन

मैंने एक सह-कर्मचारी को सॉफ्टवेयर के एक टुकड़े को स्थापित करने का एक नया प्रशिक्षण दिया था। इसमें /tmpएक उपनिर्देशिका बनाना, वहाँ एक gzipped टारबॉल खोलना, इंस्टॉलर चलाना और सफाई करना शामिल था। नौसिखिया ने सोचा rm -rf /tmp/foo-installकि ऐसा करने का सही तरीका है, और जैसा कि अनुभवी हाथ ने अपने सबसे अच्छे डार्थ-वाडर-ए-एंड-ऑफ-द-एपिसोड-III की छाप में "नूओवो" कहा, नएब ने मुश्किल तरीके से पता लगाया कि कैसे करीब है / और Enter कुंजियाँ एक-दूसरे के लिए थीं। हमें बैकअप सॉफ़्टवेयर की रिस्टोर डिस्क से बूट करना पड़ा और टेप से पूरे सर्वर को फिर से लोड करना पड़ा।
मोंटी हार्डर

0

यदि आपके पास php-cli स्थापित है,

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'

आप चाहते थे foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());या उसके कुछ करीब। $skippedपहले एक लंघन का ख्याल रखता है, @rmdirएक नीरसता को दूर करने का प्रयास करता है और चुपचाप (यह @ है) विफल रहता है यदि खाली नहीं है।
chx

0

जब आपको केवल एक स्तर की आवश्यकता होती है (माता-पिता के फ़ोल्डर को छोड़कर, लेकिन खाली बच्चे के फ़ोल्डर को हटाना), तो एक आसान ट्रिक का उपयोग करना है rmdir

rmdir parent/*

सभी खाली सबफ़ोल्डर्स को हटाता है, लेकिन केवल फ़ाइलों और गैर-खाली फ़ोल्डरों के लिए एक त्रुटि प्रिंट करता है।

यह पुनरावर्ती रूप से काम नहीं करता है, लेकिन जब आपके फ़ोल्डर संरचना को जानते हैं तो यह कुछ करने का सबसे तेज़ तरीका हो सकता है

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

फायदा: याद रखना आसान है, तेजी से टाइप करना, गलत पैरामीटर चुनने की थोड़ी संभावना।
नुकसान: कम लचीला, संभवतः आपके टर्मिनल में बहुत सारे त्रुटि संदेश।

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