मुझे पता है कि 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 rm
GNU \ 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
।