मेरे द्वारा खोजे जाने वाले फ़ोल्डर को कैसे "खोज" कर सकते हैं?


18

मैं निम्नलिखित कमांड चला रहा हूं:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

मैं फ़ोल्डर के तहत सभी फ़ोल्डरों को हटाना चाहता हूं processing(प्रोसेसिंग फोल्डर को कभी भी डिलीट नहीं किया जाना चाहिए)।

आदेश processingफ़ोल्डर को भी हटा रहा है । मैं उस फ़ोल्डर के अंतर्गत केवल फ़ोल्डर को हटाने के लिए स्क्रिप्ट को कैसे सीमित करूं ?


जवाबों:


32

सबसे आसान तरीका सिर्फ जोड़ना -mindepth 1होगा, जो पहली गहराई पदानुक्रम को छोड़ देगा और इस तरह अपने मूल निर्देशिका को छोड़ देगा।

इसके अलावा, आप एक अतिरिक्त की जरूरत नहीं है -execकरने के लिए कॉल rm, आप कर सकते हैं बस deleteफ़ोल्डरों सीधे अगर वे खाली।

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

यदि वे खाली नहीं हैं:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

यदि आप आलसी हैं तो आप वाइल्डकार्ड का विस्तार भी कर सकते हैं। चूंकि *वर्तमान निर्देशिका डिफ़ॉल्ट रूप से शामिल नहीं होती है ( जब तक dotglobकि सेट न हो ), आप यह भी कर सकते हैं:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

हालाँकि, इसमें छिपे फ़ोल्डर भी शामिल नहीं होंगे, फिर से dotglobविकल्प के कारण ।


नमस्ते, मुझे "ढूंढना: चेतावनी: आपने गैर-विकल्प तर्क-प्रचार के बाद -mindepth विकल्प निर्दिष्ट किया है, लेकिन विकल्प स्थितीय नहीं हैं (-mindepth निर्दिष्ट किए गए परीक्षणों को प्रभावित करता है, साथ ही इससे पहले निर्दिष्ट किए गए)। । अन्य तर्कों से पहले "और" लगता है: नहीं हटा सकते हैं `/ फ़ोल्डर / 50d82faf0e09e ': निर्देशिका खाली नहीं"
Elad Dotan

टाइप करने से पहले माइंडफेथ जोड़ें। निर्देशिकाओं को हटाने के लिए जब आप खाली नहीं होते हैं तो आप मूल रूप से आपके पास मौजूद rm दृष्टिकोण से चिपक सकते हैं।
slhck

4

समस्या यह है कि अन्य निर्देशिकाओं के साथ-साथ वर्तमान निर्देशिका (।) भी मिल जाती है, इसलिए यह प्रसंस्करण फ़ोल्डर के साथ-साथ उपनिर्देशिकाओं को भी हटा देती है। एक त्वरित तरीका है कि विकल्प को जोड़ना होगा

-not -name .

जो वर्तमान निर्देशिका को आउटपुट करने से रोकता है, और बदले में इसे हटाए जाने से रोकता है।

यदि आप प्रोसेसिंग डायरेक्टरी के भीतर कमांड चला रहे हैं तो यह काम करेगा, इसलिए इस तथ्य की अनुमति देने के लिए कि आप एक निरपेक्ष पथ का उपयोग कर रहे हैं:

-not -name /var/www/html/content/processing

और पूरा कमांड होगा:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

अंतिम आदेश गलत है। -nameबेसन को संदर्भित करता है, यह कभी भी स्लैश के साथ कुछ भी मेल नहीं खाता है। आपको शायद उपयोग करने की आवश्यकता है -path
कामिल मैकियोरोस्की

1

पहले से ही उत्तर दिया गया है, फिर भी मैं एक और दृष्टिकोण सूचीबद्ध करना चाहूंगा।

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

यह शीर्ष निर्देशिका (और भी उप निर्देशिकाओं) को बाहर कर देगा, और अब आप जो भी आदेश लागू कर सकते हैं, उसे लागू कर सकते हैं।

>> विकल्प:
-mindepth 1: रूट डायरेक्टरी को बाहर करने के लिए -maxdepth 1:
उप निर्देशिकाओं को पार्स करने से बचने के लिए। (प्रश्न के रूप में विशेष परिदृश्य के लिए, आपको इसकी आवश्यकता नहीं है)।
-Type d: केवल निर्देशिका प्रकारों की सूची बनाएं। यह विकल्प माइंडथ मैक्सडेपथ उपयोग के बाद आना चाहिए।


क्यों -maxdepth 1? -type dदो बार क्यों ? यह स्वीकार किए गए उत्तर के लिए अलग कैसे है?
Attie

@Attie: धन्यवाद, गलती को सुधार लिया। मैक्सडेपथ आवश्यक नहीं है, लेकिन यह उपयोगी होगा यदि आप उप-निर्देशिकाओं को सूचीबद्ध करने से बचना चाहते हैं।
प्रशान्त
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.