उनके नाम से फ़ाइलों और निर्देशिकाओं को हटा दें। ऐसी कोई फ़ाइल या डायरेक्टरी नहीं है


32

मुझे सभी संकलित डेटा को हटाने की आवश्यकता है:

  • निर्देशिकाएं build,
  • निर्देशिकाएं obj,
  • * .so फाइलें।

मैंने एक कमांड लिखी

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

कि सभी निर्देशिकाओं के माध्यम से पुनरावर्ती और सभी की जरूरत को हटा देता है।

मेरे पास आखिर में ऐसा आउटपुट क्यों है? शायद मुझे एक अलग कमांड लिखना चाहिए।

find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory

आप किस सिस्टम पर हैं? आपको हमेशा findइस तरह का उपयोग करना चाहिए find /search_directory optionsकि खोज निर्देशिका को छोड़ना एक अच्छा विचार नहीं है
किवी

इस तरह से स्वचालित हटाना एक बुरा विचार है। आपके पास एक स्क्रिप्ट हो सकती है जो आपको उम्मीदवार दे सकती है, जिसे आपको तब सुनिश्चित करना चाहिए कि आप सिस्टम के लिए महत्वपूर्ण या आवश्यक कुछ भी नहीं हटा रहे हैं। आप स्पष्ट नहीं हैं कि आप इसे कहाँ चला रहे हैं। यदि आप केवल एक उपयोगकर्ता स्थान में ऐसा कर रहे हैं, तो मुझे लगता है कि यह बहुत नुकसान नहीं कर सकता है, लेकिन आपको यह सुनिश्चित करना चाहिए कि आप गलती से सिस्टम क्षेत्र में ऐसा नहीं कर रहे हैं। आप निश्चित रूप से उपयोगकर्ता के रूप में ऐसी स्क्रिप्ट चलाना चाहते हैं।
फहीम मीठा

@ कीवी, @ फेहीमिथ, कमान का इस्तेमाल केवल परियोजना के निर्देशन में किया जाएगा; इससे वहां कोई नुकसान नहीं होगा।
मकिसिम दिमित्रिक

जवाबों:


54

-pruneउन निर्देशिकाओं पर उपयोग करें , जिन्हें आप findफ़ाइलों को खोजने की कोशिश कर रहे परेशान नहीं करने के लिए बताने के लिए वैसे भी हटाने जा रहे हैं:

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

यह भी नोट करें कि *.soइसे उद्धृत करने की आवश्यकता है अन्यथा इसे .soमौजूदा निर्देशिका में फ़ाइलों की सूची में शेल द्वारा विस्तारित किया जा सकता है ।

आपके GNU- -regexटाइप के बराबर होगा:

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

ध्यान दें कि यदि आप GNU विशिष्ट सिंटैक्स का उपयोग करने जा रहे हैं, तो आप -deleteइसके बजाय भी उपयोग कर सकते हैं -exec rm -rf {} +। साथ -delete, जीएनयू findचालू हो जाती है -depthस्वचालित रूप से। यह उस तरह से बाहरी कमांड नहीं चलाता है, यह अधिक कुशल है, और यह भी सुरक्षित है क्योंकि यह दौड़ की स्थिति को हटा देता है, जहां कोई आपको निर्देशिका को सिम्पलिंक में बदलकर गलत फ़ाइलों को हटाने में सक्षम हो सकता है findएक फ़ाइल पाता है और rmइसे हटाता है ( info -f find -n 'Security Considerations for find'विवरण के लिए देखें)।

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

-deleteयह भी रिक्त स्थान की तरह चीजों को बेहतर ढंग से संभालता है
इजाका

@ इज़्काता, इससे बेहतर नहीं -exec rm -rf {} +जिसके पास उन लोगों के साथ कोई समस्या नहीं है।
स्टीफन चेज़लस

@StephaneChazelas - मैं उलझन में हूँ {}- क्या उन्हें उद्धृत किया जाना चाहिए या नहीं? यह उद्धरण के बिना काम करने लगता है, लेकिन जीएनयू फाइंडुटिल्स मैनुअल'{}' उदाहरण में उपयोग करता है। कृपया क्या आप स्पष्टीकरण दे सकते हैं?
grebneke 14

1
@grebneke, मुझे लगता है कि कहीं न कहीं एक पोस्ट है जिसका दावा है कि उद्धरण बहुत पुराने संस्करणों में आवश्यक हो सकते हैं csh, लेकिन मैं कभी भी उस दावे को सत्यापित नहीं कर सका। वे किसी भी आधुनिक शेल में आवश्यक नहीं हैं जो मुझे पता है। वे निश्चित रूप से POSIX द्वारा आवश्यक नहीं हैं। POSIX उदाहरण उन्हें प्रयोग नहीं करते।
स्टीफन चेज़लस

3
और -deleteनिर्देशिकाओं के साथ इस्तेमाल नहीं किया जा सकता है।
St0rM

8

मुझे लगता है कि इसका कारण यह है कि findपहले डायरेक्टरी ट्री को डिलीट कर दिया जाता है और डायरेक्टरी कंटेंट को चेक करने की कोशिश की जाती है जो जाहिर तौर पर बेस्ट ऑर्डर नहीं है। आप findपहले सामग्री की जाँच करने के लिए बाध्य कर सकते हैं:

find . -depth ...

आपको -deleteफ़ाइलों के लिए और -exec rmdirनिर्देशिकाओं के लिए उपयोग करने पर विचार करना चाहिए ।


0

मेरा समाधान।

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ बनाम; in -exec कमांड


यह हमेशा काम करने वाला नहीं है, केवल अगर निष्पादन के बीच कोई सीमा नहीं हटाई गई निर्देशिका के अंदर होती है।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स, "निष्पादन के बीच की सीमा" का क्या मतलब है?
दिमित्री

1
-exec … {} +एक बार में कई फ़ाइलों के लिए कमांड निष्पादित करता है, जितने कमांड लाइन पर फिट होते हैं। यदि बहुत अधिक फाइलें हैं (या अधिक सटीक रूप से यदि रास्तों की कुल लंबाई बहुत लंबी है), के findकई उदाहरणों को निष्पादित करेगा rm, और इस प्रकार यह एक निर्देशिका को हटाने का अंत हो सकता है, जो कि ट्रैवर्सिंग है। यह कम से कम के साथ +की संभावना है ;, लेकिन +समस्या का समाधान नहीं है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.