find -delete गैर-रिक्त निर्देशिकाओं को नहीं हटाता है


32

आदेश

$ find ~ -name .DS_Store -ls -delete

मैक ओएस एक्स पर काम करता है, लेकिन

$ find ~ -name __pycache__ -type d -ls -delete

ऐसा नहीं है - निर्देशिकाएं पाई जाती हैं लेकिन नष्ट नहीं की जाती हैं।

क्यूं कर?

पुनश्च। मुझे पता है कि मैं कर सकता हूं

$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +

सवाल यह है कि find -delete काम क्यों नहीं करता है।

जवाबों:


36

findके -deleteध्वज के समान काम करता है rmdirजब निर्देशिकाओं को हटाने। यदि निर्देशिका खाली नहीं है, तो यह नष्ट हो सकता है।

आपको पहले निर्देशिका को खाली करना होगा। चूंकि आप निर्दिष्ट कर रहे हैं -type d, इसलिए आपके findलिए ऐसा नहीं होगा।

आप इसे दो पास करके हल कर सकते हैं: सबसे पहले नामित डायर के भीतर सबकुछ हटा दें __pycache__, फिर नामित सभी डायर को हटा दें __pycache__:

find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete

थोड़ा कम कसकर नियंत्रित, लेकिन एक लाइन में:

find ~ -path '*/__pycache__*' -delete

यह आपके घर के भीतर कुछ भी हटा देगा __pycache__जो इसके रास्ते का हिस्सा है।


4.4.2 खोजने पर, अंतिम कमांड की जरूरत है find ~ -path '*/__pycache__*' -delete, या शायद find ~ -path '*/__pycache__/*' -o -name __pycache__ -deleteसुरक्षित होने के लिए।
n

3
@ naught101, find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -deleteजैसा होना चाहिए और पहले से अधिक है या होना चाहिए ।
स्टीफन चेजलस

6

इसके कुछ संभावित कारण हैं।

1) आपने इसे केवल निर्देशिका हटाने के लिए कहा था ( -type d), और उन निर्देशिकाओं में अभी भी उनके अंदर फाइलें हैं।

2) आपकी निर्देशिकाओं में केवल अन्य निर्देशिकाएँ होती हैं, इसलिए -type dसामग्री समस्या का ध्यान रखा जाएगा। हालाँकि आप OS-X का उपयोग कर रहे हैं, जो काफी हद तक FreeBSD पर आधारित है, और findडिफ़ॉल्ट रूप से FreeBSD अपनी सामग्री से पहले निर्देशिका को संसाधित करेगा।
हालाँकि यह -depthविकल्प findअपनी सामग्री के बाद निर्देशिका को संसाधित करने के लिए कहकर इस समस्या को हल करने के लिए मौजूद है ।

find ~ -name __pycache__ -type d -ls -delete -depth

यह समस्या linux पर मौजूद नहीं है क्योंकि -deleteविकल्प अंतर्निहित रूप से सक्षम करता है -depth

 

FreeBSD man 1 find:

 -depth  Always true; same as the non-portable -d option. Cause find to
   perform a depth-first traversal, i.e., directories are visited in
   post-order and all entries in a directory will be acted on before
   the directory itself. By default, find visits directories in
   pre-order, i.e., before their contents. Note, the default is not
   a breadth-first traversal.

GNU man 1 find:

 -depth Process each directory's contents before the directory itself. The -delete
        action also implies -depth.

2
हाँ, लेकिन FreeBSD की खोज (1) के लिए कहते हैं -delete, "... गहराई-पहले ट्रैवर्सल प्रसंस्करण इस विकल्प द्वारा निहित है।", और GNU मिल (1) कहते हैं, "... -Dill तात्पर्य -Depth , ...", इसलिए इसे नहीं करना चाहिए। -depthकमांड में जोड़ना आवश्यक है ।
जी-मैन का कहना है कि मोनिका '

1
जीएनयू findमैनपेज से: "भ्रम को रोकने के लिए, वैश्विक विकल्पों को कमांड बिंदु पर निर्दिष्ट करना चाहिए, शुरुआती बिंदुओं की सूची के बाद, पहले परीक्षण से पहले, स्थितिगत विकल्प या कार्रवाई। यदि आप किसी अन्य स्थान पर वैश्विक विकल्प निर्दिष्ट करते हैं, तो पाएंगे। चेतावनी संदेश जारी करते हुए बताएं कि यह भ्रामक हो सकता है। " अब, दिए गए आदेश के -deleteबाद एक "वैश्विक विकल्प" है ~। मैंने यह भी देखा है कि इससे कोई फर्क नहीं पड़ता कि आप जोड़ते हैं -depthया नहीं। गैर-रिक्त निर्देशिका अनिर्धारित रहती हैं (लेकिन ऐसा शायद इसलिए है क्योंकि मैं -maxdepthभी उपयोग करता हूं )
डेविड टोनहोफर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.