मुझे एक निर्देशिका में सभी फ़ाइलों को हटाने की आवश्यकता है, लेकिन उनमें से कुछ को बाहर करें। उदाहरण के लिए, फ़ाइलों के साथ एक निर्देशिका में 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
up
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