Unix में सभी लेकिन एक फाइल को कैसे डिलीट करें? [डुप्लिकेट]


जवाबों:


20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

उदाहरण :

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

'Test2' को छोड़कर सभी फाइलों को हटाने के लिए:

ls * | grep -v test2 | xargs rm -rf

तब 'ls' आउटपुट है:

test2

संपादित करें:

टिप्पणी के लिए धन्यवाद। यदि निर्देशिका में रिक्त स्थान वाली कुछ फ़ाइलें हैं:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

आप उपयोग कर सकते हैं (बैश के साथ):

rm !("test 1"|"test 4")

'ls' आउटपुट:

test 1
test 4

बहुत समान खोज का उपयोग करने जा रहा था, लेकिन आपका काम और आप तेजी से कर रहे थे। +1
Rory Alsop

2
यह विफल रहता है यदि आपके पास उनके नाम के रिक्त स्थान वाली फाइलें हैं।
Mat

रिक्त स्थान के साथ फ़ाइल नाम को संभालने के लिए कोई भी उपयोग कर सकता है ls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

मान लें कि आप बैश शेल (सबसे सामान्य मामला) का उपयोग कर रहे हैं, तो आप नकारात्मक ग्लोबिंग (पथनाम विस्तार) प्रतीक का उपयोग कर सकते हैं:

rm -rf !(myfile.txt)

यह विस्तारित ग्लोबिंग का उपयोग करता है, इसलिए आपको इसे पहले सक्षम करना होगा:

shopt -s extglob




0

एक पुनरावर्ती के लिए rm आपको इसके साथ पुनरावृत्ति करने की आवश्यकता होगी find और उस फ़ाइल को बाहर रखें जिसे आप रखना चाहते थे (या) grep, लेकिन यह आपको व्हाट्सएप मुसीबत में डाल सकता है)। एक शेल ग्लोब के लिए, आधुनिक शेल में ग्लोब पैटर्न होते हैं जिनका उपयोग फ़ाइलों को बाहर करने के लिए किया जा सकता है; यह उपलब्ध होने पर शेल-स्तरीय ग्लोब पुनरावृत्ति के साथ जोड़ा जा सकता है (जैसे। zsh है rm **/*~foo/bar - ध्यान दें कि यह बड़ी निर्देशिका पेड़ों के लिए तर्क लंबाई सीमा में चलने की संभावना है)।

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