मैं पहले से ही उपनिर्देशिका और फाइलें कैसे हटाऊं, लेकिन पहली अभिभावक निर्देशिका नहीं?


14

मैं लक्ष्य निर्देशिका को हटाने और इसके सभी उपनिर्देशिकाओं और सामग्रियों को पुन: उपयोग करने में सक्षम हूं।

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

हालाँकि, मैं नहीं चाहता कि लक्ष्य निर्देशिका निकाली जाए। मैं लक्ष्य, उपनिर्देशिका और उनकी सामग्री में सिर्फ फाइलें कैसे निकाल सकता हूं?

जवाबों:


12

पिछला उत्तर लगभग सही है। हालाँकि, आपको शेल ग्लोब वर्णों को उद्धृत नहीं करना चाहिए यदि आप उन्हें काम करना चाहते हैं। तो, यह वह कमांड है जिसकी आप तलाश कर रहे हैं:

rm -rf "/target/directory with spaces/"*

ध्यान दें कि * दोहरे उद्धरण चिह्नों के बाहर है। यह फॉर्म भी काम करेगा:

rm -rf /target/directory\ with\ spaces/*

यदि आपके पास *ऊपर दिखाए गए उद्धरणों में उद्धरण हैं, तो यह केवल *लक्ष्य निर्देशिका के अंदर शाब्दिक रूप से नामित एकल फ़ाइल को हटाने का प्रयास करेगा ।


1
यह छिपी हुई फ़ाइलों और फ़ोल्डरों के साथ काम नहीं करता है। मुझे इसे एक बार फिर से करना था
अनफुन कैट ऑक्ट

8

तीन और विकल्प।

  1. के findसाथ प्रयोग करें -mindepth 1और -delete:

    Ormindepth के स्तर
    किसी भी परीक्षण या कार्यों को स्तरों (एक गैर any नकारात्मक पूर्णांक) से कम स्तरों पर लागू नहीं करते हैं।
    Themindepth 1 का अर्थ है कमांड लाइन के तर्कों को छोड़कर सभी फाइलों को प्रोसेस करना।

    -delete
    फ़ाइलें हटाएं; सच अगर हटाने में सफल रहा। यदि निष्कासन विफल हुआ, तो एक त्रुटि संदेश जारी किया जाता है। यदि nondelete विफल रहता है, तो बाहर निकलने की स्थिति को नॉनज़रो (जब यह अंततः बाहर निकलता है) मिलेगा। Ofdelete का उपयोग स्वचालित रूप से optiondepth विकल्प को चालू करता है।
    इस विकल्प का उपयोग करने से पहले -depth विकल्प के साथ सावधानीपूर्वक परीक्षण करें।

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. उपयोग करें find, लेकिन फाइलों के साथ, निर्देशिका नहीं। यह करने की आवश्यकता से बचा जाता है rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. आगे बढ़ो और मूल निर्देशिका को हटा दें, लेकिन इसे फिर से बनाएँ। आप एक कमांड के साथ ऐसा करने के लिए बैश फ़ंक्शन बना सकते हैं; यहाँ एक साधारण एक लाइनर है:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

कैसा रहेगा

rm -rf /target/directory\ path/*

अगर वहाँ के साथ शुरू फाइलें हो सकती है। लक्ष्य निर्देशिका में।

rm -rf "/target/directory path/*" "/target/directory path/.??*"

यह दूसरा, ए के साथ शुरू होने वाली सभी चीजों को मिला देगा, सिवाय। और .. यह .a जैसे नामों पर विफल होगा, लेकिन यह बहुत आम नहीं है। सभी मामलों को कवर करने के लिए यदि आवश्यक हो तो इसे ट्विक किया जा सकता है।


मैंने दोनों की कोशिश की और वे मेरे लिए काम नहीं करते हैं। शायद ऐसा इसलिए है क्योंकि मेरे लक्ष्य निर्देशिका पथ में रिक्त स्थान हैं? rm -rf '/ लक्ष्य / निर्देशिका पथ / *' यह कोई त्रुटि नहीं देता है, लेकिन उपनिर्देशिकाएँ बनी रहती हैं।
माइकल प्रिस्कॉट

आपको रिक्त स्थान से बचने की आवश्यकता है, या तो अंतरिक्ष से पहले बैकस्लैश (\) के साथ, या पूरे निर्देशिका नाम को उद्धरण (") में संलग्न करके। मैंने इसे दिखाने के लिए उदाहरणों को संपादित किया।
कीथ

धन्यवाद, मैंने कोशिश की कि मेरी पिछली टिप्पणी में दिखाया गया है और अभी भी नहीं जाना है। (मैं ओएस एक्स का उपयोग कर रहा हूं, क्या वह बात करता है?)
माइकल प्रिस्कॉट

ओएस एक्स को ठीक काम करना चाहिए, यही मैं उपयोग कर रहा हूं। सुनिश्चित करें कि आप बैकस्लैश और उद्धरण दोनों का उपयोग नहीं करते हैं। केवल एक या दूसरे।
कीथबी

हां, सिर्फ उद्धरणों का उपयोग करते हुए। यदि मैं * को हटा देता हूं और इसलिए मैं केवल rm -rf "/ target / directory पाथ /" का उपयोग कर रहा हूं, तो "डायरेक्टरी पाथ" डायरेक्टरी को "डायरेक्टरी पाथ" सबडेलरीज के साथ हटा दिया जाएगा। अगर मैं rm -rf "/ target / निर्देशिका पथ / *" का उपयोग करता हूं, तो कुछ भी नहीं होता है।
माइकल प्रेस्कॉट

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