मैं सभी उप-निर्देशिकाओं को एक निर्देशिका से कैसे निकालूं?


51

यह प्रश्न द्वितीय चरण का पहला प्रश्न है जो मैंने यहाँ पोस्ट किया है

मेरे पास एक निर्देशिका है जिसमें उप-निर्देशिकाओं, .zip फ़ाइलों का एक गुच्छा होता है, और अन्य यादृच्छिक फाइलें एक उप-निर्देशिका के भीतर समाहित नहीं होती हैं।

मैं पैरंट डायरेक्टरी के भीतर से सभी उप-निर्देशिकाओं को हटाने के लिए एक कमांड लाइन स्क्रिप्ट चाहता हूं, लेकिन सभी ज़िप फाइलें और ढीली फाइलें ऐसी रखें जो किसी भी उप-निर्देशिका से संबंधित न हों। सभी उप-निर्देशिकाओं में सामग्री है, इसलिए मेरा मानना ​​है कि मुझे -f कमांड के साथ उनके विलोपन के लिए मजबूर करना होगा।

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

मैं समझता हूं कि कमांड लाइन से आइटम हटाने के लिए विशेष देखभाल की आवश्यकता होती है, लेकिन मैंने दूरस्थ रूप से बैकअप लेने के लिए पहले से ही सभी आवश्यक सावधानी बरती है।

जवाबों:


61

BASH में आप ट्रेलिंग स्लैश का उपयोग कर सकते हैं (मुझे लगता है कि इसे किसी भी POSIX शेल में काम करना चाहिए):

rm -R -- */

ध्यान दें, --जो विकल्पों को तर्कों से अलग करता है और एक को हाइफ़न से शुरू होने वाली प्रविष्टियों को हटाने की अनुमति देता है - अन्यथा शेल द्वारा विस्तार के बाद प्रवेश नाम को विकल्प के रूप में व्याख्या किया जाएगा rm(वही कई अन्य कमांड लाइन उपयोगिताओं के लिए भी है)।

-fयदि आप गैर-लेखन योग्य फ़ाइलों को हटाते समय पुष्टि के लिए संकेत नहीं करना चाहते हैं तो विकल्प जोड़ें ।

ध्यान दें कि डिफ़ॉल्ट रूप से, छिपी निर्देशिकाएं (जिनके नाम से शुरू होता है .) को अकेला छोड़ दिया जाएगा।

एक महत्वपूर्ण चेतावनी: */वसीयत के विस्तार में सिमिलिंक भी शामिल होगा जो अंततः टाइप डायरेक्टरी की फाइलों को हल करता है । और rmकार्यान्वयन के आधार पर , rm -R -- thelink/या तो सिम्लिंक को हटा देगा, या (उनमें से अधिकांश में) लिंक किए गए डायरेक्टरी की सामग्री को पुन: हटा देगा, लेकिन न तो उस डायरेक्टरी को और न ही सिमलिंक को।

यदि उपयोग किया जाता है zsh, तो एक बेहतर दृष्टिकोण केवल प्रकार निर्देशिका की फ़ाइलों का चयन करने के लिए एक ग्लोब क्वालीफायर का उपयोग करना होगा :

rm -R -- *(/) # or *(D/) to include hidden ones

या:

rm -R -- *(-/)

सहानुभूति को निर्देशिकाओं में शामिल करना (लेकिन क्योंकि, इस बार, विस्तार में अनुगामी /एस नहीं है , यह सिमिलिंक है जिसे सभी rmकार्यान्वयनों के साथ हटा दिया गया है)।

साथ bash, एटी एंड टी ksh, yashया zshआप कर सकते हैं:

set -- */
rm -R -- "${@%/}"

अनुगामी बनाना /


सुंदर! यह पूरी तरह से काम करता है। मुझे नहीं पता था कि यह करना इतना आसान था। क्या आप -r बनाम -R और उन आदेशों पर क्या करते हैं? बहुत धन्यवाद।
इवस्टर

-r, -R, --recursiveजिसका अर्थ है 'रिकर्सिवली निर्देशिका और उनकी सामग्री हटाने "समानार्थक शब्द हैं।
पेट्रफ

क्या आप समझा सकते हैं - और * / क्या करते हैं?
उभयचर

6
आप यह भी कह सकते हैं rm -R ./*/- यह हाइफन नाम की समस्याओं से भी बचता है।
l0b0

1
बस सावधान रहें * और / के क्रम को बदलने के लिए नहीं। rm -R - / * कुछ पूरी तरह से अलग करता है जो आप नहीं करना चाहते हैं: |
क्रिसऑडनी

13

वाइल्डकार्ड तरीके के अलावा, आप ऐसा करने के लिए find(कम से कम GNU खोज) का उपयोग भी कर सकते हैं :

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

अन्य findपंक्तियों के साथ , आप पहले भाग को चला सकते हैं ( find -mindepth 1 -maxdepth 1 -type d) निर्देशिका की एक सूची देखने के लिए जिसे हटा दिया जाएगा।

एक सुरक्षित विकल्प कुछ ऐसा करना है:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

जिनमें से कोई भी ../to-rmइसे हटाने के बजाय सभी सामान को स्थानांतरित कर देगा । आप इसे सत्यापित कर सकते हैं कि आप क्या चाहते थे, वे rm -Rfअपने अवकाश पर उस निर्देशिका को।


"सीएलआई-कचरा बिन" के लिए +1 to-rmऔर findजो अच्छी तरह से निर्देशिकाओं को डॉट (किसी भी अन्य बोझिल एस्कॉर्ट के अलावा) से शुरू करता है। :)
पेट्रफ

पारितोषिक के लिए धन्यवाद। मुझे हटाने से पहले एक अलग निर्देशिका में जाने का विचार पसंद है। मैं मैक ओएस एक्स पर टर्मिनल के माध्यम से काम कर रहा हूं, और मुझे विश्वास है कि मुझे -mindepth और -maxdepth कमांड का उपयोग करने के लिए किसी प्रकार के GNU पैकेज को स्थापित करना होगा, सही?
इवस्टर

@Evster यकीन नहीं है कि अगर मैक ओएस एक्स पाते हैं तो वे समर्थन करते हैं। मुझे लगता है कि fink (है कि अभी भी चारों ओर है?) एक लगता है कि स्थापित कर सकता है। या आप उन्हें छोड़ सकते हैं, और फिर grep का उपयोग करके उत्पादित फ़ाइल सूची को फ़िल्टर कर सकते हैं। निश्चित रूप से उस पर एमवी विकल्प का उपयोग करें, आरएमटी से परे।
derobert

4

आप इनमें से कुछ सुझावों के लिए एक स्क्रिप्ट बनाना चाहते हैं, विशेष रूप से rm -R -- */, और इसे अपने / usr / स्थानीय / बिन फ़ोल्डर में रख सकते हैं; या aliasअपनी ~ / .bashrc फ़ाइल में एक बनाएँ । चूँकि एक कमांड को गलत तरीके से बनाना और आपके सिस्टम को तोड़ना बहुत आसान है - यहां तक ​​कि एक अक्षर और / या अक्षरों के क्रम के परिणामस्वरूप भयावह परिणाम हो सकते हैं - यह विभिन्न विकल्पों और तर्कों को टाइप करने की तुलना में कुछ अधिक मजबूत समाधान के रूप में काम करेगा। हर बार जब आप इस कार्य को पूरा करना चाहते हैं।

इसके अलावा, आप अपनी स्क्रिप्ट / कमांड में विकल्प -i or --interactive=onceया -I or --interactive=alwaysविकल्प को शामिल करना चाह सकते हैं जो अनपेक्षित विलोपन से बचने के लिए एक अन्य उपकरण के रूप में काम करेगा।

इसके अलावा, व्युत्पन्न की तरह कुछ सबसे अच्छा होगा सुझाव ; बस एक फ़ाइल / टर्मिनल-एडिटर में स्क्रिप्ट को कॉपी / पेस्ट करें और इसे अपनी विशिष्ट आवश्यकताओं के साथ समायोजित करें, और फ़ाइलों / निर्देशिकाओं को एक एकल निर्देशिका में ले जाया जाएगा (जिसकी सामग्री आप जांच / सत्यापित कर सकते हैं) जिसे आप बस हटा सकते हैं rm -rfआदेश जारी करना ।

एक अन्य विकल्प GUI- एप्लिकेशन का उपयोग करना है, जैसे कि आपका फ़ाइल प्रबंधक, और बस उन सभी लागू फ़ाइलों / फ़ोल्डरों का चयन करें जिन्हें आप हटाना चाहते हैं। यदि आपके पास अनुमतियाँ नहीं हैं, तो अपने वितरण के मैनुअल-पृष्ठों की जाँच करें।

अंत में, यदि फ़ोल्डर खाली हैं - अनिवार्य रूप से सरल फ़ाइलनाम - आप rmdirउन्हें हटाने के लिए कमांड का उपयोग कर सकते हैं। यह आपके द्वारा डिलीट की जाने वाली हर चीज के लिए काम नहीं करता है, लेकिन यह उस समय काम आएगा जब आप कुछ "घर की सफाई" करना चाहते हैं। ** आप -p --ignore-fail-on-non-emptyविकल्प की कोशिश कर सकते हैं , जो आपको कुछ उप-निर्देशिकाओं के साथ-साथ उनके खाली "माता-पिता" को हटाने की अनुमति देगा - वे निर्देशिका जिसमें वे रहते हैं।


यह एक अलग स्क्रिप्ट बनाने पर एक बहुत अच्छा विचार है जिसे मैं इस कमांड के लिए कह सकता हूं। क्या आप बता सकते हैं कि वास्तव में -i और -I विकल्प क्या करते हैं? धन्यवाद!
इवस्टर

-आप "एंटर" करने के बाद एक बार आपको यह पुष्टि करने का विकल्प देंगे कि आप इसे हटाना चाहते हैं (जब 3 से अधिक फ़ाइलें / फ़ोल्डर "चयनित" हैं); जबकि -i विकल्प प्रत्येक फ़ाइल के लिए एक संकेत जारी करेगा, जिस पर आप बस "y" और "एंटर" टैप करके पुष्टि कर सकते हैं - एक पुष्टिक प्रतिक्रिया के अलावा कुछ भी परिणामी प्रक्रिया को हटाने के दौरान उस विशिष्ट फ़ाइल को छोड़ दिया जाएगा।
ILMostro_7

1

पहले आपको निर्देशिकाओं को सूचीबद्ध करने की आवश्यकता है और फिर उन्हें हटा दें, सामान्य फ़ाइलों को बाधित किए बिना, ls -d * /, केवल उप-निर्देशिकाओं को सूचीबद्ध करता है, और इसे rm के साथ पाइप करना निर्देशिकाओं और सामग्रियों को हटा देता है, ढीली फ़ाइलों को बरकरार रखता है।

यह कमांड काम करना चाहिए,

ls -d  */ | xargs rm -rf

1
इससे अधिक लाभ क्या होगा rm -rf -- */? बहुत बड़ी त्रुटियों के आसपास काम करने के लिए printf '%s\0' */ | xargs -r0 rm -rf --शेल (जहां printfबिल्ट और नहीं है ls) में मदद करेगा , लेकिन अतिरिक्त समस्याओं को छोड़कर AFAICT में कुछ भी नहीं जोड़ता है। ls -d */ | xargs rm -rf
स्टीफन चेजलस

1
@AnthonyGeoghegan, उदाहरण के लिए यदि कोई निर्देशिका " .."(स्पेस ..) कहा जाता है , तो यह कुछ lsकार्यान्वयन के साथ मूल निर्देशिका की सामग्री को हटा देगा । और यह न केवल रिक्त स्थान है, यह अन्य रिक्त अक्षर, न्यूलाइन, एकल उद्धरण, डबल उद्धरण, बैकस्लैश और फ़ाइल नाम से शुरू हो रहा है -
स्टीफन चेजलस

2
@Ankit, आप के साथ शुरू कर सकता है mywiki.wooledge.org/ParsingLs
स्टीफन Chazelas

1
जब आप पूरी तरह से @ StéphaneChazelas के सुझाव को समझते printfहैं, तो एक सूची बनाने के लिए उपयोग करें जहां प्रत्येक नाम को शून्य वर्ण द्वारा समाप्त किया जाता है, इसलिए इसे विकल्प के xargsसाथ संसाधित किया जा सकता है -0, मैं आपको सलाह दूंगा कि आप अपने उत्तर को उसकी विविधता के साथ अपडेट करने के लिए संपादित करें। मुझे पूरा विश्वास है कि वह आपके कोड स्निपेट का उपयोग करने के लिए आपके लिए खुश होगा यदि आप इसे समझते हैं और यह जान गए हैं कि यह कुछ फ़ाइल नामों के कारण अवांछनीय व्यवहार के खिलाफ कैसे गार्ड होता है जो संभावित रूप से मौजूद हो सकता है।
एंथनी जी -

1
उपयोग xargsकरने से स्वीकृत उत्तर पर एक फायदा होता है (यह काम करता है जब वर्तमान निर्देशिका में बहुत बड़ी संख्या में फाइलें / निर्देशिकाएं होती हैं) इसलिए इसे एक उपयोगी उत्तर में संपादित करने की गुंजाइश है। व्यक्तिगत रूप से, मैंने स्टैक एक्सचेंज के सवालों का जवाब देना एक अच्छा सीखने का अनुभव माना है - खासकर जब मुझे अन्य उपयोगकर्ताओं से उपयोगी फीड-बैक मिलता है।
एंथनी जी -

-1

rm -rf <directory name>। यह काम करता हैं। बस टाइप rm <directory name>करने से सब उप प्रश्नों की संख्या बढ़ जाती है जिसमें प्रत्येक उप निर्देशिका को मैन्युअल रूप से हटाया जाना चाहिए। लेकिन, rm -rfएक बार में अपनी उप निर्देशिकाओं के साथ पूरी निर्देशिका को हटाने में मदद करता है।


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