मैं वाइल्डकार्ड के साथ पुनरावर्ती निर्देशिकाओं को कैसे हटाऊं?


51

मैं एसएसडी के माध्यम से डब्ल्यूडी माई बुक वर्ल्ड एडिशन पर काम कर रहा हूं। मूल रूप से मैं एक विशेष निर्देशिका स्तर पर शुरू करना चाहूंगा, और सभी उप-निर्देशिका मिलानों को पुन: हटा सकता हूं .Apple*। मैं उसके बारे में कैसे जाऊंगा?

मैंने कोशिश की

rm -rf .Apple* तथा rm -fR .Apple*

उप-निर्देशिका के भीतर उस नाम से मेल खाने वाली निर्देशिकाओं को हटाया नहीं गया।

जवाबों:


73

find पूरे पेड़ पर चुनिंदा कार्य करने के लिए बहुत उपयोगी है।

find . -type f -name ".Apple*" -delete

यहां, -type fयह सुनिश्चित करता है कि यह एक फ़ाइल है, निर्देशिका नहीं है, और यह बिल्कुल वैसा नहीं हो सकता है जैसा आप चाहते हैं, क्योंकि यह सिमिलिंक, सॉकेट और अन्य चीजों को भी छोड़ देगा। आप उपयोग कर सकते हैं ! -type d, जिसका शाब्दिक अर्थ निर्देशिका नहीं है, लेकिन फिर आप वर्ण और ब्लॉक डिवाइस भी हटा सकते हैं। मेरा सुझाव है -typeकि मैन पेज के लिए विधेय को देखें find

वाइल्डकार्ड के साथ इसे कड़ाई से करने के लिए, आपको उन्नत शेल समर्थन की आवश्यकता है। बैश v4 के पास globstarविकल्प है , जो आपको पुन: उपयोग करके उपनिर्देशिका से मिलान करने देता है **zshऔर kshइस पैटर्न का समर्थन भी करते हैं। इसका उपयोग करके, आप कर सकते हैं rm -rf **/.Apple*। यह POSIX- मानक नहीं है, और बहुत पोर्टेबल नहीं है, इसलिए मैं इसे एक स्क्रिप्ट में उपयोग करने से बचूंगा, लेकिन एक बार की इंटरैक्टिव शेल कार्रवाई के लिए, यह ठीक है।


3
मुझे find . -type d -name .Apple*काम मिल सकता है - यह सभी फ़ोल्डरों को सूचीबद्ध करता है। हालाँकि, यह तब विफल होता है जब मैं -deleteअंत में जोड़ता हूं । यह सिर्फ उपयोग सारांश के साथ वापस आता है। यह बिजीबॉक्स v1.1.1 पर चल रहा है। क्या इससे कुछ अन्तर पड़ता है?
कोडेडोग

1
-deletePOSIX भी नहीं है। 90 के दशक की शुरुआत में **पेश किया गया था zsh। अब यह (उपस्थिति के कालानुक्रमिक क्रम से) ksh93, मछली, बैश और टीसीएच में भी है।
स्टीफन चेज़लस

1
+1 के लिएrm -rf **/.Apple*
एंड्री बोयोको

1
@ कोडित, यदि इसके बजाय -deleteकाम नहीं करता है -exec rm -f {} +
वाइल्डकार्ड

1
क्या आप findइसे हटाए जाने के रूप में क्रिया कर सकते हैं ? मुझे लगता है कि "ग्लोबस्टार" विधि -vस्विच को जोड़कर ऐसा करेगी ।
डेमिस

16

मैं का उपयोग कर समस्याओं में भाग findके साथ -deleteकी जानबूझकर व्यवहार के कारण findके रूप में अपनी आदमी पेज में कहा गया है (यानी अगर पथ ./, जो वे मेरी मामले में क्या साथ शुरू होता है को नष्ट करने के लिए मना):

 -delete

मिली फ़ाइलों और / या निर्देशिकाओं को हटाएं। हमेशा सच लौटाता है। यह वर्तमान वर्किंग डायरेक्टरी से निष्पादित होता है क्योंकि पेड़ को पुन: खोजता है। यह उसके पथनाम के सापेक्ष "/" वर्ण के साथ फ़ाइल नाम को हटाने का प्रयास नहीं करेगा। सुरक्षा कारणो से।
डेप्थ-प्रथम ट्रैवर्सल प्रोसेसिंग इस विकल्प द्वारा निहित है।
इस विकल्प के साथ अनुलोम विलोम असंगत है।

इसके बजाय, मैं बस करने में सक्षम था

find . -type d -name 'received_*_output' -exec rm -r {} +

आपके मामले के लिए, ऐसा लगता है कि ग्लोब (तारांकन), * को उद्धृत करना समाधान था, लेकिन मैं अपना जवाब किसी अन्य समस्या के मामले में देना चाहता था।

नोट: पहले, मेरा जवाब निम्नलिखित करने के लिए था, लेकिन @Wildcard ने टिप्पणी में ऐसा करने में सुरक्षा खामियों की ओर इशारा किया।

find . -type d -name 'received_*_output' | xargs rm -r

1
xargsयहाँ उपयोग करने का कोई अच्छा कारण नहीं । -exec rm -r {} \;या, बेहतर है, -exec rm -r {} +विशेष चरित्र फ़ाइलनामों पर विफल होने के बिना भी करेंगे। देखें कि लूपिंग आउटपुट की खराब प्रैक्टिस से अधिक क्यों है?
वाइल्डकार्ड

यह जानकर अच्छा लगा। एक नीच लायक नहीं, IMO, क्योंकि कमांड अभी भी काम पूरा करता है, लेकिन प्रदर्शन अनुकूलन की सराहना की जाती है।
पैट

1
यदि यह सिर्फ एक प्रदर्शन अनुकूलन था, तो मैं आपसे सहमत होगा, लेकिन यह नहीं है। यह एक सुरक्षा छेद है। आप उनके नाम पर व्हाट्सएप के साथ फाइलों को सही ढंग से नहीं संभाल रहे हैं, और एक दुर्भावनापूर्ण रूप से तैयार किए गए फ़ाइल नाम से डेटा हानि होगी। बैश / POSIX गोले में एक चर को भूलने के लिए सुरक्षा निहितार्थ भी देखें ; उनमें से कुछ लागू है और यह कम से कम आपको उन मुद्दों के प्रकार का विचार दे सकता है जिनके बारे में मैं बात कर रहा हूं।
वाइल्डकार्ड

mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'अपनी निर्देशिका में प्रयास करें और फिर उसी कमांड को फिर से चलाएं, यदि आपको विश्वास नहीं है कि डेटा हानि की संभावना है। या, सवाल के बाद से, मैक ओएस के बारे में है mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'। ( चेतावनी: यदि आप ऐसा करते हैं तो आप अपनी सभी फ़ाइलों को हटा देंगे। यह मेरी बात है।)
Wildcard

0

यह संभव है कि आपके rm / find कमांड में कुछ भी गलत न हो, लेकिन जिस उपयोगकर्ता से आप लॉग इन हैं, वह वास्तव में डिलीट की अनुमति नहीं है। ls -lउनकी अनुमति के साथ चीजों को सूचीबद्ध करने के लिए उपयोग करें , और आप पहचान सकते हैं कि आप किसके साथ हैं idऔर groupsकमांड (या तो उपलब्ध होना चाहिए)। यदि आप ऐसा करने के लिए "गलत उपयोगकर्ता" हैं, तो आपको फ़ाइलों की अनुमतियों / स्वामित्व को बदलना होगा, या किसी अन्य उपयोगकर्ता पर स्विच करना होगा।



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