मुझे पता है कि txtवर्तमान निर्देशिका के तहत सभी फ़ाइल को कैसे हटाया जाए rm *.txt। क्या किसी को पता है कि मौजूदा निर्देशिका EXCEPT txtफ़ाइल की सभी फ़ाइलों को कैसे हटाया जाए ?
मुझे पता है कि txtवर्तमान निर्देशिका के तहत सभी फ़ाइल को कैसे हटाया जाए rm *.txt। क्या किसी को पता है कि मौजूदा निर्देशिका EXCEPT txtफ़ाइल की सभी फ़ाइलों को कैसे हटाया जाए ?
जवाबों:
आप उपयोग कर सकते हैं find:
find . -type f ! -name '*.txt' -delete
या बैश की विस्तारित ग्लोबिंग विशेषताएं:
shopt -s extglob
rm *.!(txt)
या zsh में:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)होना चाहिए !(*.txt)?
rmअगर फोल्डर थे तो चोक हो जाएगा।
find . -type f ! -name "*.txt" | xargs -r rmGNU \ xargs में काम करेगा। BSD और UNIX xargs कमांड नहीं हो सकता है -r के रूप में आपको अपने स्थानीयman xargs
यदि आप '* .txt' को छोड़कर सभी फ़ाइलों को हटाना चाहते हैं तो आप निम्न कमांड का उपयोग कर सकते हैं:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
लेकिन अगर आप फ़ाइलों के साथ निर्देशिकाओं को हटाना चाहते हैं तो आप इसका उपयोग कर सकते हैं:
$ find . ! -name "*.txt" -exec rm -r {} \;
आप उल्टे grep और xargs का उपयोग कर सकते हैं
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rmबस के रूप में अच्छी तरह से काम करता है
grep -v *.txtकेवल तभी काम करेगा जब वास्तव में एक .txtफ़ाइल हो। यदि कोई नहीं है, तो पैटर्न के रूप में grepउपयोग करेगा *.txt; यदि एक से अधिक है, तो यह अन्य फ़ाइल के अंदर पहले फ़ाइलनाम के लिए खोज करेगा .txt, जिसमें से आउटपुट को अनदेखा किया जाएगा ls। (सटीक परिणाम शेल के ग्लोब विकल्पों पर निर्भर हो सकते हैं।)
.txt$txtबिंदी की परवाह किए बिना समाप्त होने वाले तारों का मिलान करेगा । क्योंकि grepनियमित अभिव्यक्ति को पैरामीटर के रूप में लेता है। तो फ़ाइलें a.txtऔर aatxtऔर a-txtसभी इस अभिव्यक्ति से मिलान किया जाएगा। सही अभिव्यक्ति होनी चाहिए ls | grep -v \\.txt$ | xargs --no-run-if-empty rm। जिज्ञासु लोगों के लिए: यदि आप अभिव्यक्ति के साथ खेलना चाहते हैं तो सुरक्षित रूप से इस परीक्षण अभिव्यक्ति का उपयोग करें ls | grep \\.txt$ | xargs --no-run-if-empty echo(ध्यान दें: कोई -vझंडा नहीं है और rm=>echo)। नोट 2: आपने डबल बैकस्लैश देखा होगा। एक रेगेक्स के लिए है, दूसरा स्लैश से बचने के लिए बैश है।
बस करो:
rm $(ls -I "*.txt" ) * .Txt को छोड़कर #Deletes फ़ाइल प्रकार
इसी तरह, यदि "एक या अधिक फ़ाइल प्रकार को छोड़कर" को हटाने की आवश्यकता है, तो:
rm $(ls -I "*.txt" -I "*.pdf" ) * .Txt और * .pdf को छोड़कर #Deletes फ़ाइल प्रकार
-Iविकल्प उपयोगी हो सकता है, लेकिन देखना क्यों ls पार्स नहीं । और क्या | xargsहासिल होता है? बिना किसी तर्क के, यह सिर्फ echoअपने सभी इनपुट पर चलता है ।
xargsहासिल करना है?
यह बताई गई ( ) को छोड़कर सभी छिपी हुई (डॉट) फाइलों और फ़ोल्डरों को हटाने का काम करता है .mydir:
rm -rf $(ls -aI ".mydir")
lsकि वास्तव में कॉल करने का प्रयास कर रहे हैंrm।