लिनक्स में "परीक्षण" नामक सभी निर्देशिकाओं को ढूंढें और हटाएं


35

मेरे पास "परीक्षण" नाम की कई निर्देशिकाएं हैं और मैं उन्हें निकालना चाहूंगा।

मुझे पता है कि उन्हें कैसे खोजना है और उनका उपयोग करके प्रिंट करना है:

find . -name test -print

अब, मैं निर्देशिकाओं को कैसे निकालूं?


कृपया ध्यान दें कि मेरे पास निर्देशिका में फाइलें हैं और उन्हें भी हटाया जाना चाहिए।

जवाबों:


70

xargs सभी जादू करता है:

find . -name test -type d -print0|xargs -0 rm -r --

xargs स्टैण्डर्ड को दिए गए तर्कों के साथ, पैरामीटर को कमांड के रूप में निष्पादित किया जाता है।

यह rm -rनिर्देशिका और उसके सभी बच्चों को हटाने के लिए उपयोग कर रहा है।

--बहस के अंत को दर्शाता है, एक पथ के साथ शुरू से बचने के लिए -एक तर्क के रूप में इलाज किया जा रहा से।

-print0नई खबरों के बजाय अक्षरों findको छापना बताता \0है; और केवल तर्क विभाजक के रूप में व्यवहार करना -0बताता xargsहै \0

यह rmएक बार में कई निर्देशिकाओं के साथ कॉल कर रहा है , rmप्रत्येक निर्देशिका के लिए अलग से कॉल करने से परहेज करता है ।


विकल्प के रूप में, findप्रत्येक चयनित फ़ाइल के लिए कमांड भी चला सकते हैं :

find . -name test -type d -exec rm -r {} \;

और यह एक, बेहतर प्रदर्शन के साथ, क्योंकि यह एकrm साथ कई निर्देशिकाओं के साथ कॉल करेगा :

find . -name test -type d -exec rm -r {} +

( +अंत में ध्यान दें ; यह एक xargsसमाधान के बराबर है ।)


1
उत्कृष्ट उत्तर, विशेषकर +खोजने में। मुझे पता नहीं था, निश्चित रूप से कामना करता हूं कि मुझे पता था कि बहुत पहले।
स्कॉट

अंतिम आदेश के लिए बाहर देखो, किसी तरह यह कुछ फ़ाइलों को हटा दिया। xargsआदेश में अच्छी तरह से काम किया।
हेनरिक डी सूसा

23
find /path/to/dir -name "test" -type d -delete
  • -नाम: पारित नाम के लिए लग रहा है। आप -regexनियमित अभिव्यक्तियों के आधार पर नाम प्रदान करने के लिए उपयोग कर सकते हैं

  • -प्रकार: फ़ाइल प्रकारों के लिए दिखता है। dकेवल निर्देशिका के लिए दिखता है

  • -डेली: कार्रवाई जो मिली सूची को हटा देती है।

वैकल्पिक रूप से:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

जैसा कि JF सेबेस्टियन ने टिप्पणियों में कहा था:

आप एक समय में एक से अधिक निर्देशिकाओं को पारित करने के +बजाय उपयोग कर सकते हैं \;


1
क्षमा करें, मैं यह उल्लेख करना भूल गया कि इन निर्देशिकाओं में फाइलें हो सकती हैं। मैं उनमें से कुछ को "खोज: क्योंकि हटा नहीं सकता ।/start ': निर्देशिका को खाली नहीं कर सकता है: त्रुटि नहीं
कचरा संग्रह

@garbagecollection मैंने एक अपडेट जोड़ा है।
जयपाल सिंह

3
आप एक समय में एक से अधिक निर्देशिकाओं को पारित करने के +बजाय उपयोग कर सकते हैं \;
JFS

धन्यवाद @JFSebastian अच्छी बात। मैं इसे जवाब में जोड़ दूंगा।
जयपाल सिंह


5

आप -exec विकल्प का भी उपयोग कर सकते हैं

find . -name test -exec rm {} \;

3

मानकर बैश 4+

shopt -s globstar
rm -r ./**/test/

अनुगामी स्लैश का मतलब है कि यह केवल निर्देशिकाओं से मेल खाएगा। टेस्ट पहले से है:

printf '%s\n' ./**/test/


2

जैसा कि एक और उत्तर बताता है, आप सभी निर्देशिकाओं को खोजने का प्रयास कर सकते हैं नाम के साथtest और उन्हें हटाने का हैं

find -name "test" -type d -delete

मैं मैक पर क्रॉस संगतता के साथ कुछ मुद्दों में भाग गया, इसलिए मैंने इस समतुल्य कमांड का उपयोग किया:

find -path "*/test" -type d -delete
  • -पथ : पूरी तरह से योग्य फ़ाइलनाम में एक पैटर्न की तलाश करता है।

हालाँकि, किसी भी मामले में, यदि कोई निर्देशिका नाम है test में फाइलें हैं, तो findवे शिकायत करेंगे कि Directory is not emptyनिर्देशिका को हटाने में विफल हो जाएगा।

यदि आप निर्देशिका सहित सभी फ़ाइलों को हटाने का इरादा रखते हैं test, तो हम नामित निर्देशिकाओं के अंदर सभी फ़ाइलों को हटाने के लिए एक ही चाल का उपयोग कर सकते हैंtest पहले ।

find -path "*/test/*" -delete

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

find -path "*/test" -type d -delete

उदाहरण:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

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