Linux में, सभी फाइलों को कैसे डिलीट करें?


73

मुझे पता है कि txtवर्तमान निर्देशिका के तहत सभी फ़ाइल को कैसे हटाया जाए rm *.txt। क्या किसी को पता है कि मौजूदा निर्देशिका EXCEPT txtफ़ाइल की सभी फ़ाइलों को कैसे हटाया जाए ?


20
हमेशा की तरह, एक हानिरहित आदेश के साथ दिए गए उत्तरों का परीक्षण करें जैसे lsकि वास्तव में कॉल करने का प्रयास कर रहे हैं rm
१५:

जवाबों:


111

आप उपयोग कर सकते हैं 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

इनमें से कुछ को इस बात पर निर्भर करने की आवश्यकता हो सकती है कि आपके पास फ़ोल्डर हैं और आप उनके साथ क्या करना चाहते हैं।
केविन

1
नहीं *.!(txt)होना चाहिए !(*.txt)?
लैरी

@LauriRanta उस फ़ोल्डर पर निर्भर करता है, जिसका हमने उत्तर नहीं दिया है। यह ठीक है जैसे कि सभी फाइलों में एक्सटेंशन होते हैं, और rmअगर फोल्डर थे तो चोक हो जाएगा।
केविन

मुझे कोष्ठक के साथ एक मुद्दा मिला है। जब मैं बैश स्क्रिप्ट में ग्लोबिंग स्टाइल का उपयोग करता हूं, तो यह सिंटैक्स त्रुटि और कोष्ठक के बारे में शिकायत करता है। हालाँकि यह CLI काम करता है।
CMCDragonkai

1
@izogfif यह find . -type f ! -name "*.txt" | xargs -r rmGNU \ xargs में काम करेगा। BSD और UNIX xargs कमांड नहीं हो सकता है -r के रूप में आपको अपने स्थानीयman xargs
Ntwobike

10

यदि आप '* .txt' को छोड़कर सभी फ़ाइलों को हटाना चाहते हैं तो आप निम्न कमांड का उपयोग कर सकते हैं:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

लेकिन अगर आप फ़ाइलों के साथ निर्देशिकाओं को हटाना चाहते हैं तो आप इसका उपयोग कर सकते हैं:

$ find . ! -name "*.txt" -exec rm -r {} \;


9

वहाँ कई तरीके यह कर सकता है। लेकिन सबसे सरल तरीका होगा (बैश):

shopt -s extglob
rm !(*.txt)

4

इसके बिना एक समाधान find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

यह सभी प्रकार के गोले पर काम करना चाहिए।


3

आप उल्टे grep और xargs का उपयोग कर सकते हैं

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rmबस के रूप में अच्छी तरह से काम करता है
फिलिप्स

@phillipsk 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: आपने डबल बैकस्लैश देखा होगा। एक रेगेक्स के लिए है, दूसरा स्लैश से बचने के लिए बैश है।
दिमित्री के

1

बस करो:

rm $(ls -I "*.txt" ) * .Txt को छोड़कर #Deletes फ़ाइल प्रकार

इसी तरह, यदि "एक या अधिक फ़ाइल प्रकार को छोड़कर" को हटाने की आवश्यकता है, तो:

rm $(ls -I "*.txt" -I "*.pdf" ) * .Txt और * .pdf को छोड़कर #Deletes फ़ाइल प्रकार


StackExchange में आपका स्वागत है! -Iविकल्प उपयोगी हो सकता है, लेकिन देखना क्यों ls पार्स नहीं । और क्या | xargsहासिल होता है? बिना किसी तर्क के, यह सिर्फ echoअपने सभी इनपुट पर चलता है ।
जिग्लीगैनाग

क्या xargsहासिल करना है?
ढग

धन्यवाद, xargs उपरोक्त मामले में उपयोगी नहीं था, अब सही हो गया है।
सूर्या

0

यह बताई गई ( ) को छोड़कर सभी छिपी हुई (डॉट) फाइलों और फ़ोल्डरों को हटाने का काम करता है .mydir:

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