"Rm -rf फ़ाइल नाम [co]" कमांड में [co] का क्या अर्थ है?


16

मान लीजिए कि मेरे पास दो फाइलें हैं /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

अब, rm -rf[co] विकल्प के साथ कमांड चलाने देता है

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

क्या कोई समझा सकता है कि यहाँ क्या हो रहा है? [co]पैरामीटर क्या है ? हम इसे अन्य एक्सटेंशन के लिए कैसे काम कर सकते हैं? कहो कि मेरे पास foo.jsऔर foo.coffeeफाइलें हैं, क्या हम कुछ rm -rf /tmp/foo.coffe[co]हटाना पसंद कर सकते हैं /tmp/foo.js?


8
वहाँ के लिए कोई ज़रूरत नहीं है -rf, क्योंकि वे न तो निर्देशिका ( --recursive), और न ही अयोग्य ( --force) हैं।
डेल्टैब

13
इसकी कोई आवश्यकता नहीं है -rfऔर जड़ के रूप में चीजों को करने की कोई आवश्यकता नहीं है। खासकर अगर सवाल में चीजें शामिल हैं rm -rf
टेराडॉन

दोस्तों, इसका सिर्फ नमूना समस्या को समझाने का आदेश देता है। वास्तविक सवाल [co]शेल ग्लोब के बारे में था । धन्यवाद।
अनीश

8
@aneeshep यदि किसी को बंदूक की बैरल नीचे दिख रही है और वह इसे साफ करने का तरीका पूछ रहा है, तो क्या आप पहले उन्हें बैरल को देखने के बारे में चेतावनी देते हैं या उन्हें बताएं कि इसे कैसे साफ किया जाए?
डंकन एक्स सिम्पसन

जवाबों:


34

[co]rmकमांड के लिए कोई पैरामीटर नहीं है - यह एक शेल ग्लोब है जो सेट से एकल वर्ण के बराबर पैटर्न से मेल खाता है[co] - दूसरे शब्दों में, यह या तो फ़ाइलनाम के एक cया एक oछोर से मेल खाता है । से man bash:

[...]  Matches any one of the enclosed characters

दोनों का मिलान करने के लिए foo.coffeeऔर foo.js, क्योंकि प्रत्ययों में कोई सामान्य सबस्टीट्यूशन नहीं होता है, इसलिए आप जो सबसे अच्छा कर सकते हैं, वह किसी भी फाइलनाम से foo.*मेल खाएगा जिसके बजाय आप ब्रेस विस्तार का उपयोग कर सकते हैं जैसेfoo.

rm foo.{coffee,js}

यूप मिल गया। मैं मूल अवधारणा को याद कर रहा हूं;) धन्यवाद :)
aneeshep

7
खोज पैटर्न की तरह [abc]या *जाएगा फ़ाइलें खोजने जबकि {}नहीं होगा। / tmp पर जाएं, टाइप करें echo nya[ab]; echo nya{a,b}, फिर touch nyaaऔर फिरecho nya[ab]; echo nya{a,b}
सान्या_जोल

16

यह एक पैरामीटर नहीं है, लेकिन अक्षरों का संग्रह (या "शेल ग्लोब") है। यह बिल्कुल वैसा है:

rm -rf /tmp/hello.py[co]

के समान है

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

समान ...

rm -rf /tmp/hello.py[c-o]

ASCII के आदेश का पालन /tmp/hello.pycकरने और शामिल करने से कुछ भी हटा देगा /tmp/hello.pyo

rm -rf /tmp/hello.py[ab][cd]

निकाल देंगे ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

कहते हैं, मेरे पास foo.js और foo.cfish फाइलें हैं, क्या हम कुछ rm -rf /tmp/foo.coffe[co]हटाना पसंद कर सकते हैं /tmp/foo.js

आप बल्कि फैंसी तरीकों से कर सकते हैं, लेकिन उन 2 फ़ाइलों के लिए मैं उन्हें प्रत्येक के लिए 1 कमांड के साथ हटा दूंगा। एक और उदाहरण उन 2 फाइलों के जितना करीब हो सकता है ...

rm /tmp/foo.[cj]*

इस तरह फ़ाइलों को हटा देगा ...

rm /tmp/foo.c*
rm /tmp/foo.j*

इसलिए यह सिर्फ इन 2 फ़ाइलों की तुलना में कहीं अधिक शामिल होगा।


2
अगर मुझे गलतफहमी नहीं है, तो आपको rm -rfसभी मैचों के साथ एक ही मंगलाचरण मिलता है, एक -एक मैच के साथ एक-एक नहीं।

1
हाँ। लेकिन rm का इरादा नहीं जोड़ा। उन लोगों को सिर्फ यह दिखाना है कि एक समकक्ष के रूप में टाइप करने की क्या आवश्यकता होगी ;-)
रिनविंड

1

यह एक शेल ग्लोब है, वाइल्डकार्ड के समान *और ?... बैश में, फ़ाइल नाम पैटर्न *.[co]उन सभी फ़ाइलनामों से मेल खाता है , जिनके साथ खत्म होता है .cया.o

*.[co]बनाम *.c *.oया के साथ अंतर यह *.{c,o}है कि दो बाद वाले पैटर्न एक डमी में विस्तारित होंगे *.oयदि कोई .oफ़ाइल निर्देशिका में मौजूद नहीं है , जबकि *.[co]संस्करण नहीं होगा।

शेल ग्लोब गैर-संवेदनशील तरीके से फ़ाइल संचालन करने के लिए उपयोगी होते हैं। उदाहरण के लिए, यदि आप फ़ाइल नाम है कि अंत के साथ साथ फ़ाइलों का एक समूह है jpg, JPG, Jpg, JPg, आदि ... और आप उन सभी को हटाना चाहते हैं, तो आप कर सकते हैं:

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