कैसे लिनक्स पर एक बार में कई फ़ाइलों को हटाने के लिए?


103

मेरे पास लिनक्स सर्वर पर फाइलों की यह सूची है:

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

मैं चयनित लॉग फ़ाइलों को एक-एक करके हटा रहा हूं, rm -rfनीचे दिए गए कमांड का उपयोग करके देखें:

rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

क्या कोई और तरीका है, ताकि मैं एक बार में चयनित फ़ाइलों को हटा सकूं?


4
और "जीएनयू / लिनक्स कहो, न कि केवल लिनक्स", मैं पीछे की सीटों से कुछ गड़गड़ाहट सुनता हूं।
बोरिस स्टिटनिक

8
वैसे, tthe -rf क्यों? क्या ये फोल्डर हैं? f को बल देना है, r पुनरावर्ती के लिए है। यह तभी काम करेगा जब यह केवल एक फ़ाइल है, लेकिन चेतावनी दी जा रही है, -rf का उपयोग करके हर बार जब आप कुछ हटाना चाहते हैं तो बहुत (बहुत) (बहुत) बहुत खतरनाक है। (और आपको "bash" टैग जोड़ना चाहिए क्योंकि "linux" बहुत चौड़ा है।
Depado

@BorisStitnicky - मैं उत्सुक हूं कि GNUइसकी आवश्यकता क्यों है?
user66001

2
@ user66001: इस मामले पर GNU प्रोजेक्ट की राय के लिए: gnu.org/gnu/linux-and-gnu.html । मैं मामले पर कोई स्थिति नहीं लेता, कम से कम यहाँ नहीं, और यह बहस करने का स्थान नहीं है।
कीथ थॉम्पसन

2
@BorisStitnicky - वाद-विवाद की कोई आवश्यकता नहीं, पूरी तरह से स्पष्टता थी, और उस लिंक ने मुझे सूचना का स्तर दिया था जिसे मैं +1 की तलाश कर रहा था
user66001

जवाबों:


159

बैश सभी प्रकार के वाइल्डकार्ड और विस्तार का समर्थन करता है।

आपका सटीक मामला ब्रेस विस्तार द्वारा संभाला जाएगा , जैसे:

$ rm -rf abc.log.2012-03-{14,27,28}

उपरोक्त तीनों तर्कों के साथ एकल कमांड में विस्तारित होगा , और टाइपिंग के बराबर होगा:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

यह ध्यान रखना महत्वपूर्ण है कि यह विस्तार शेल द्वारा किया जाता है, इससे पहले rmभी लोड किया गया है।


यदि आप भविष्य में फ़ाइलों को पुनर्स्थापित करना चाहते हैं, तो "rm" का उपयोग न करें। आप "rm-कचरा" उपयोगिता का उपयोग कर सकते हैं: github.com/nateshmbhat/rm-trash
Natesh bhat

75

एक वाइल्डकार्ड ( *) का उपयोग कई फाइलों से मिलान करने के लिए करें।

उदाहरण के लिए, नीचे दी गई कमांड सभी फाइलों को हटा देगी, जिनके नाम शुरुआत हैं abc.log.2012-03-

rm -f abc.log.2012-03-*

मैं ls abc.log.2012-03-*फ़ाइलों को सूचीबद्ध करने के लिए दौड़ने की सलाह दूंगा ताकि आप यह देख सकें कि rmकमांड चलाने से पहले आप क्या हटाने जा रहे हैं ।

अधिक जानकारी के लिए फ़ाइल नाम विस्तार पर बैश मैन पेज देखें ।


बहुत उपयोगी है, लेकिन यह हटाने के लिए पुष्टि के लिए नहीं कह रहा है। कृपया ध्यान रखें।
नर्सिसलुक

1
@nuriselcuk आप प्रत्येक फ़ाइल को हटाए जाने की पुष्टि प्राप्त करने के लिए -i जोड़ सकते हैं।
फेलिप रोमेरो

अमेज़ॅन लिनक्स 1 पर चलने वाले AWS Ec2-Instance पर एक आकर्षण की तरह काम किया गया :) धन्यवाद।
काइल ब्रिडेनस्टाइन

41

यदि आप उन सभी फ़ाइलों को हटाना चाहते हैं जिनके नाम एक विशेष रूप से मेल खाते हैं, तो एक वाइल्डकार्ड (ग्लोब पैटर्न) सबसे सीधा समाधान है। कुछ उदाहरण:

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

नियमित अभिव्यक्ति वाइल्डकार्ड की तुलना में अधिक शक्तिशाली हैं; आप के उत्पादन में फ़ीड कर सकते हैं grepकरने के लिए rm -f। उदाहरण के लिए, यदि फ़ाइल के कुछ नाम शुरू होते हैं "abc.log"और कुछ के साथ "ABC.log", grepआप केस-असंवेदनशील मिलान करते हैं:

$ rm -f $(ls | grep -i '^abc\.log\.')

यदि फ़ाइल नामों में से किसी में रिक्त स्थान शामिल है, तो यह समस्या पैदा करेगा। सावधान रहे।

जब मैं ऐसा करता हूं, तो मैं सबसे ls | grep ...पहले कमांड चलाता हूं और जांचता हूं कि यह मेरे इच्छित आउटपुट का उत्पादन करता है - खासकर अगर मैं उपयोग कर रहा हूं rm -f:

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

जहां !!पिछले कमांड में फैलता है। या मैं rm -fकमांड जोड़ने के लिए ऊपर-तीर या Ctrl-P टाइप कर सकता हूं और पिछली पंक्ति को संपादित कर सकता हूं ।

यह मानता है कि आप बैश शेल का उपयोग कर रहे हैं। कुछ अन्य गोले, विशेष रूप से csh और tsh और कुछ पुराने श-व्युत्पन्न गोले, $(...)सिंटैक्स का समर्थन नहीं कर सकते हैं । आप बराबर बैकटिक सिंटैक्स का उपयोग कर सकते हैं:

$ rm -f `ls | grep -i '^abc\.log\.'`

$(...)वाक्य रचना पढ़ने में आसान है, और अगर तुम सच में महत्वाकांक्षी रहे हैं यह नेस्टेड हो सकता है।

अंत में, यदि आप जिन फ़ाइलों को हटाना चाहते हैं, उन्हें आसानी से एक नियमित अभिव्यक्ति के साथ व्यक्त नहीं किया जा सकता है, तो एक ट्रिक जो मैं अक्सर उपयोग करता हूं वह है फ़ाइलों को अस्थायी पाठ फ़ाइल में सूचीबद्ध करना, फिर उसे संपादित करना:

$ ls > list
$ vi list   # Use your favorite text editor

मैं तब listफ़ाइल को मैन्युअल रूप से संपादित कर सकता हूं , केवल उन फ़ाइलों को छोड़कर जिन्हें मैं हटाना चाहता हूं, और फिर:

$ rm -f $(<list)

या

$ rm -f `cat list`

(फिर से, यह माना जाता है कि फ़ाइल नामों में से कोई भी मज़ेदार वर्ण नहीं है, विशेष रूप से स्थान।)

या, listफ़ाइल संपादित करते समय , मैं rm -f प्रत्येक पंक्ति की शुरुआत में जोड़ सकता हूँ और फिर:

$ . ./list

या

$ source ./list

फ़ाइल को संपादित करना भी जहाँ आवश्यक हो, उदाहरण के लिए उद्धरण जोड़ने का अवसर rm -f foo barहै rm -f 'foo bar'


8

बस सबलाइन में मल्टीलाइन चयन का उपयोग सभी फाइलों को एक पंक्ति में मिलाने के लिए करें और प्रत्येक फ़ाइल नाम के बीच एक स्थान जोड़ें और फिर rmसूची की शुरुआत में जोड़ें । यह ज्यादातर तब उपयोगी होता है जब आप जिन फ़ाइल नाम को हटाना चाहते हैं उनमें कोई पैटर्न नहीं है।

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

यह स्वीकृत उत्तर होना चाहिए क्योंकि यह स्पष्ट रूप से प्रस्तुत प्रश्न का उत्तर देता है। यह उन लोगों के लिए अधिक अनुकूल है जो Google से यहां आए थे।
ATLief

5

एक वाइल्ड कार्ड इसके लिए अच्छी तरह से काम करेगा, हालांकि सुरक्षित होने के लिए वाइल्ड कार्ड का उपयोग कम से कम करना सबसे अच्छा होगा, इसलिए इस की तर्ज पर कुछ करें:

rm -rf abc.log.2012-*

हालांकि यह लग रहा है से, वे सिर्फ एक फाइलें हैं? यदि उन वस्तुओं में से कोई भी निर्देशिका नहीं है, तो पुनरावर्ती विकल्प आवश्यक नहीं होना चाहिए, ताकि सबसे अच्छा उपयोग न हो, बस सुरक्षा के लिए।


2

मैं एक लिनक्स गुरु नहीं हूं, लेकिन मेरा मानना ​​है कि आप आउटपुट फ़ाइलों की अपनी सूची को पाइप करना चाहते हैं xargs rm -rf। मैंने अच्छे परिणाम के साथ अतीत में कुछ इस तरह का उपयोग किया है। पहले एक नमूना निर्देशिका पर परीक्षण!

EDIT - मुझे गलतफहमी हो सकती है, जो अन्य उत्तरों के आधार पर दिखाई दे रही है। यदि आप वाइल्डकार्ड, महान का उपयोग कर सकते हैं। मैंने मान लिया कि आपकी मूल सूची जिसे आपने प्रदर्शित किया था, उसे आपके "चयन" देने के लिए एक कार्यक्रम द्वारा उत्पन्न किया गया था, इसलिए मैंने सोचा कि पाइपिंग को xargsजाने का रास्ता होगा।


-1

यदि आप एक बार में निर्देशिका से संबंधित सभी फ़ाइलों को हटाना चाहते हैं। उदाहरण के लिए: आपकी निर्देशिका का नाम "लॉग" है और "लॉग" निर्देशिका में abc.log.2012-03-14, abc.log.2012-03-15, ... फाइल शामिल हैं। आपको लॉग डायरेक्टरी से ऊपर होना चाहिए और:

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