एक को छोड़कर सभी उप-निर्देशिकाओं को हटा दें


10

मान लीजिए कि वर्तमान निर्देशिका के अंतर्गत, कई उप-निर्देशिकाएं हैं, और एक को ए कहा जाता है।

बैश के साथ ए को छोड़कर सभी उप-निर्देशिकाओं को कैसे हटाएं?

जवाबों:


23

बैश ने ग्लोबिंग (पहले परीक्षण, फिर प्रतिध्वनि हटाएं) बढ़ाया है:

shopt -s extglob
echo rm -rf !(A)

(इससे पहले कि मैं भूल जाते हैं - आप अक्षम CSH शैली इतिहास पूरा होने, Bash3 में वहाँ एक बग अनदेखा करते समय है हो सकता है (सेट + H!।

+1 बैश अगर आश्चर्य से भरा हो! कभी-कभी वे इस तरह अच्छे होते हैं।
अलेग्जोन लेवचुक

वास्तव में बहुत अच्छा है! उम्मीद के मुताबिक काम करता है। साथ shopt | grep extआप अगर प्लगइन सक्षम होने पर देख सकते हैं।
खतरे '


10

व्हाट अबाउट:

mv A /tmp/
rm * -rf
mv /tmp/A .

यह अन्य कमांड्स में टाइपो के कुछ "घबराहट" से बचा जाता है।


1
+1 करने की अपेक्षा उपकरण की अपेक्षा स्मार्ट तरीके से किया जाता है। फिर भी, एक रात, जब मैं सिर्फ लिनक्स सीख रहा था, मैंने अपना पहला रेम्पाइल करने से पहले कर्नेल को / tmp पर कॉपी किया। यह सफल नहीं हुआ, लेकिन पुराने को मिटा दिया, इसलिए मैंने कहा 'कोई पसीना नहीं, मेरे पास एक प्रति है' केवल यह पता लगाने के लिए कि आधी रात के क्रोन कार्य ने इसे / tmp में एक सप्ताह से अधिक पुरानी हर फ़ाइल के साथ मिटा दिया था! मैं फिर से recompile था और इस बार यह सही है, या मेरे लिए कोई रिबूट!
जेवियर

सबसे अच्छा जवाब पोस्ट :)
वॉरेन

3

कुछ इस तरह

find . -type d -not -name A -exec rm -ir {} \;

करना चाहिए।

संपादित करें

यह वास्तव में होना चाहिए

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

findए से नीचे आने से रोकने के लिए ।


3
लेकिन, यह भी A / foo और A / bar की तरह किसी भी उप-निर्देशिका को हटा देगा, लेकिन A / A को संरक्षित करेगा।
TCampbell

ठंडा! प्रश्न और उत्तर एसओ से एसएफ में माइग्रेट हो जाते हैं ... लेकिन ऊपर मेरा संपादन खो गया था ...
अग्नुल

मैक्सडेपथ को स्वैप करने और इस तरह के तर्क टाइप करने के लिए बेहतर होना चाहिए: खोजें। -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
स्पॉनट्राइडर

1

मैं आमतौर पर एक ls कमांड पर काम करके ऐसा करता हूं जो इसे पहले प्राप्त करता है। मैं यूनिक्स मशीन में नहीं हूँ, लेकिन कुछ इस तरह है:

ls -lda "[^ A]"

एक बार जब आप इसे सही कर लेते हैं, तो इसे एक कमांड पर पाइप करें

ls -lda "[^ A]" | xargs rm -rf

अगर मुझे मेरी नियमित अभिव्यक्ति गलत लगी है तो ऊपर संपादित करने के लिए स्वतंत्र महसूस करें ...


आपको ls पार्स नहीं करना चाहिए: mywiki.wooledge.org/ParsingLs
आगे की सूचना तक

1

यदि आप और अधिक लचीला होना चाहते हैं, लेकिन मैनुअल आप कर सकते हैं:

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

इस तरह आप सामान्य मंजन कर सकते हैं।


1

यहाँ एक तरीका है। इस तरह की बातों से सावधान रहें, हालांकि, यह इतना शक्तिशाली है कि इसका इस्तेमाल केवल अच्छे या बुरे के लिए ही किया जा सकता है ...

खोजें * -टाइप डी | grep -v "^ ए" | xargs rm -rf

1

कुछ लोगों द्वारा -exec और rm को दिखाए बिना पास -प्रिंट0 और खोजने के लिए -0 xargs के साथ उपयोग न करें। यह रिक्त स्थान या newlines के साथ फ़ाइल नामों पर भ्रमित हो जाएगा:

$ mkdir 'foo foo'
$ mkdir foo$'\n'foo 
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory

इसके बजाय find -print0 का उपयोग xargs -0, '-exec कमांड {} +', या -delete के साथ करें यदि आपका खोज इसका समर्थन करता है।



1

इसके पहले के उदाहरण के अलावा:

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

आप भी कर सकते हैं:

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

cd some/subdirपहले होने से बचने के लिए ।

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