मुझे एक निर्देशिका में सभी फ़ाइलों को हटाने की आवश्यकता है, लेकिन उनमें से कुछ को बाहर करें। उदाहरण के लिए, फ़ाइलों के साथ एक निर्देशिका में a b c ... z
, मुझे छोड़कर सभी को हटाने की आवश्यकता है u
और p
। क्या इसे करने का कोई आसान तरीका है?
मुझे एक निर्देशिका में सभी फ़ाइलों को हटाने की आवश्यकता है, लेकिन उनमें से कुछ को बाहर करें। उदाहरण के लिए, फ़ाइलों के साथ एक निर्देशिका में a b c ... z
, मुझे छोड़कर सभी को हटाने की आवश्यकता है u
और p
। क्या इसे करने का कोई आसान तरीका है?
जवाबों:
मैं उन मामलों में क्या करता हूं टाइप करना है
rm *
तब मैं प्रेस Ctrl+ X, *करने के लिए विस्तार *
सभी दृश्य फ़ाइल नाम में।
तब मैं सिर्फ उन दो फाइलों को हटा सकता हूं जिन्हें मैं सूची से रखना पसंद करता हूं और अंत में कमांड लाइन निष्पादित करता हूं।
*
बहुत लंबी नहीं हो जाती। : -}
Ctrl
+ Shift
+ x
+*
करने के लिए rm
सभी लेकिन u,p
पार्टी में सिर्फ टाइप करें:
rm !(u|p)
इसके लिए निम्नलिखित विकल्प की आवश्यकता होती है:
shopt -s extglob
और देखें: ग्लोब - ग्रेग का विकी
shopt -s extglob
@Ashot करने की जरूरत है । इसके अलावा, यह सिर्फ फाइलें हैं, निर्देशिका नहीं, यही वजह है कि मैंने -rf
आपके आदेश में विकल्प हटा दिए हैं ।
rm !(index).html
:। यह "index.html" के अपवाद के साथ ".html" में समाप्त होने वाली सभी फ़ाइलों को हटा देगा।
आप उपयोग कर सकते हैं find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
अगले एक्सप्रेशन को नकारता है-name
एक फ़ाइल नाम निर्दिष्ट करता है-maxdepth 1
केवल निर्दिष्ट निर्देशिका find
द्वारा प्रक्रिया खोजेंगे ( डिफ़ॉल्ट ट्रैवर्स निर्देशिका द्वारा)-type f
केवल फाइलों को प्रोसेस करेगा (और उदाहरण निर्देशिकाओं के लिए नहीं)-delete
फ़ाइलों को हटा देगाफिर आप खोज के मैन पेज को देखते हुए शर्तों को ट्यून कर सकते हैं
अपडेट करें
के -print
बजाय का उपयोग करके पहले अपने आदेश का परीक्षण करें-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
बस के बाद .
यह आपदा हो जाएगा (CWD में सभी फाइलों को नष्ट करेगा)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
मेरा सबसे अच्छा दोस्त है, खासकर जब ग्लोब के लिए बहुत सारी फाइलें हैं
सरल:
mv
फ़ाइलों को आप एक ऊपरी निर्देशिका में चाहते हैं, rm
निर्देशिका और फिर mv
उन्हें वापस।
rm
बिना -r
नहीं होगा।
इस उत्तर के समान, लेकिन कोई विशेष विकल्प की आवश्यकता नहीं है, जहाँ तक मुझे पता है कि निम्नलिखित "प्राचीन" कार्यक्षमता किसी (अस्पष्ट) / बिन / श सदृश खोल (जैसे bash, zsh, ksh, आदि) द्वारा समर्थित है।
rm [^up]
rm [^up]*
? मैं अक्सर ऐसी ही चीजें करता हूं।
इसे बिना खोजे:
ls | grep -v '(u|p)' | xargs rm
(संपादित करें: "u" और "v", जैसे अन्य स्थानों में, पूरे रेगेक्स के सामान्य संस्करणों के रूप में उपयोग किया जा रहा है। जाहिर है आप बहुत सी चीजों से मेल खाने से बचने के लिए अपने रेगीक्स को लंगर डालना सावधान रहना चाहेंगे।)
आप निश्चित रूप से एक स्क्रिप्ट चाहते हैं यदि आप ऐसा करने जा रहे हैं, जैसा कि अन्य ने सुझाव दिया है।
-E
याegrep
u
p
grep -L (u|p)' * | xargs rm
जहाँ -L
सूची फ़ाइलनाम का मिलान न हो।
u
या p
नहीं, किसी भी फाइल में एक u
या एक फाइल नहीं है p
। वह सही है। आप का उपयोग करके ठीक कर सकते हैंegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
फ्लॉपी युग में मेरे पास "छोड़कर" नामक एक डोज़ निष्पादन योग्य था जो वर्तमान निर्देशिका से चीजों को अस्थायी रूप से बाहर ले जाएगा और एक कमांड निष्पादित करेगा, इसलिए आप कह सकते हैं:
* .txt डेल * को छोड़कर। *
अपनी पाठ फ़ाइलों के लिए सब कुछ हटाने के लिए।
यह एक शेल स्क्रिप्ट के रूप में लागू करने के लिए एक बहुत ही मामूली बात होगी और अगर इस तरह की बात है तो आपको दो बार से अधिक करने की संभावना है, ऐसा लगता है कि यह एक अच्छा विचार होगा।
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
यह यूएक्स और पी को छोड़कर सभी फाइलों को यूनिक्स में हटा देगा
उन लोगों के लिए जो एक पूर्ण विकसित रेगेक्स एमएसीएस, पॉज़िक्स-ऑक या पॉज़िक्स-विस्तारित शैली (देखें मैन पेज देखें) में मनमाना कॉम्प्लेक्स अपवर्जित पैटर्न (सभी प्रभावित फाइलनामों को फैलाना) को निर्दिष्ट करना चाहते हैं (मैं मैन पेज ढूंढता हूं) मैं इसे सुझाऊंगा। यह इस उदाहरण में u
और p
वर्तमान dir में शामिल नहीं है । यह स्क्रिप्ट के लिए उपयोगी हो सकता है।
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
केवल GNU संस्करणों पर काम करेगा
find
का GNU एक्सटेंशन है find
। -regextype
विकल्प के लिए भी यही बात लागू होती है। इसके अलावा, आपका आदेश उपनिर्देशिकाओं में भी फ़ाइलों को हटा देगा, जबकि मूल प्रश्न एक निर्देशिका में फ़ाइलों के बारे में स्पष्ट रूप से पूछा गया था।
अभी तक एक और:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
यह लंबा चौड़ा है और मुझे नहीं पता कि क्या आप आसानी से इसे एक फंक्शन में बना सकते हैं जो आसानी से समायोजित हो सकता है और मनमानी संख्या को तर्क दे सकता है, लेकिन यह अच्छी तरह से काम करता है।
और यह शुद्ध बैश अच्छाई है।
यहाँ एक और संस्करण है। आपको लिखना आता है:
rm -i *
या:
rm --interactive *
तो rm
आपको प्रत्येक फ़ाइल को हटाने की पुष्टि करने के लिए कहेंगे।
उपयोग:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
U, p और .ext फ़ाइलों को छोड़कर, निर्देशिकाओं सहित सभी फ़ाइलों को हटाने के लिए।
एक आसान तरीका जो गड़बड़ करना मुश्किल है: मान लें कि आप * .pdf को छोड़कर सब कुछ हटाना चाहते हैं:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp