"Rm *" चलाते समय "कोई मिलान नहीं मिला" से कैसे छुटकारा पाएं


23

उपयोग करते हुए zsh, मुझे एक "नो मैच पाया" संदेश मिलता है, जब एक पैटर्न का चयन होता है rmजो आउटपुट के साथ पुनर्निर्देशित करने पर भी फिट नहीं होता है।

# rm * > /dev/zero 2>&1
  zsh: no matches found: *

मैं इस संदेश से कैसे छुटकारा पा सकता हूं?


क्या आप वर्तमान निर्देशिका में सब कुछ हटाने की कोशिश कर रहे हैं? वर्तमान निर्देशिका क्या है?
कटकराजेएम

आप setopt extended_glob(या यहां तक ​​कि सादे rm * >/dev/null 2>&1) का उपयोग कर सकते हैं, लेकिन वास्तव में आपको ज़रूरत नहीं करने के लिए एक वर्कअराउंड बनाना चाहिए rm *, यह
बिल्कुल

आपको वास्तव में डूबना चाहिए /dev/nullबल्कि तब dev/zero। इसके अलावा, आपके स्‍टैंडर पुनर्निर्देशन की कमी है &; यह होना चाहिए 2>&1
रोज़ा

त्रुटि संदेश zshकमांड के मूल्यांकन के दौरान उत्पन्न होता है और कमांड के रनटाइम के दौरान नहीं होता है (त्रुटि के कारण कमांड रन नहीं होता है)। यहां आउटपुट पुनर्निर्देशन केवल कमांड के आउटपुट को प्रभावित करेगा न कि शेल को।
अडेपोन

जवाबों:


44

यह व्यवहार Zsh के nomatchविकल्प द्वारा नियंत्रित किया जाता है । डिफ़ॉल्ट रूप से, यदि कमांड लाइन में एक ग्लोबिंग एक्सप्रेशन होता है जो कुछ भी मेल नहीं खाता है, तो Zsh आपके द्वारा देखे जा रहे त्रुटि संदेश को प्रिंट करेगा, और कमांड को बिल्कुल भी नहीं चलाएगा। आप इसे चलाकर अक्षम कर सकते हैं

setopt +o nomatch

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


4
व्यवहार को विकल्पों nullglobऔर cshnullglobविकल्पों द्वारा भी नियंत्रित किया जाता है । यदि nullglobसेट किया गया है और कोई मिलान फ़ाइल नहीं मिली है, तो पैटर्न को जनरेशन एरर के बजाय तर्क सूची से हटा दिया जाता है। cshnullglobजब तक कमांड में सभी पैटर्न का कोई मेल न हो, तब तक सेटिंग का एक समान प्रभाव होता है, जिस स्थिति में एक त्रुटि की सूचना दी जाएगी। नोट: सेटिंग nullglobया cshnullglobओवरराइड nomatch। तुम भी सेट कर सकते हैं nullglobग्लोब क्वालीफायर का उपयोग करके एक पैटर्न के लिए N: rm *(N)
आदेपन

nomatchआदर्श से कम है, कि बॉर्न जैसे गोले क्या करते हैं। यदि पैटर्न मेल नहीं खाता है, तो इसे- rm(-!) पास किया जाता है, जिस पर rmकोई त्रुटि होगी, या इससे भी बदतर फ़ाइल *.[ch]को उदाहरण के लिए एक पैटर्न के लिए हटा सकता है !
स्टीफन चेज़लस

9

आप इसके बजाय क्या करना चाहेंगे? बिल्कुल नहीं rm(1)? इसे *अन्य बॉर्न-जैसे गोले (2) की तरह शाब्दिक तर्क के साथ चलाएं ? इसे बिना किसी तर्क के चलाएं (3)?

  1. files=(*(N)); (($#files)) && rm -- $files। या (rm -- *) 2> /dev/nullलेकिन यह भी वास्तविक त्रुटियों को छिपाएगा rmजिसके द्वारा मूर्खतापूर्ण होगा। आप zshत्रुटि को छोड़ सकते हैं, लेकिन rmकमांड के लिए stderr को पुनर्स्थापित कर सकते हैं(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
  2. emulate sh -c 'rm -- *' 2> /dev/null। फिर जैसे shकि zshअब उस एकल कमांड लाइन के लिए अनुकरण किया जाता है, गैर-मिलान के *रूप में पारित किया जाता है rmऔर rmशिकायत करता है कि *फ़ाइल मौजूद नहीं है। rmजैसा कि आप shउस त्रुटि संदेश को दबाने के लिए करते हैं, हम ऐसा करने के लिए प्रयास करेंगे , लेकिन फिर से, यह मूर्खतापूर्ण है क्योंकि यह वास्तविक त्रुटियों को छिपाएगा, rmक्योंकि shशाब्दिक रूप *से पारित होने के दुर्व्यवहार के कारण हुई त्रुटि rm। हालाँकि, rm -f '*'एक अन-मौजूदा *फ़ाइल के बारे में कोई शिकायत नहीं करेगा , इसलिए आप ऐसा कर सकते हैंemulate sh -c 'rm -f -- *'
  3. rm -- *(N)rmहालांकि जब किसी भी तर्क पारित नहीं शिकायत करेगा, हालांकि फिर से, नहीं rm -f: rm -f -- *(N)

आम तौर पर, rm -fवह कमांड है जिसका आप उपयोग करना चाहते हैं यदि आप चाहते हैं कि सभी फाइलें चली गई हैं और केवल एक त्रुटि मिलती है यदि फाइलें नहीं निकाली जा सकती हैं या rmवापस आने के बाद भी IOW हैं । आप आमतौर पर -fस्क्रिप्ट में उपयोग करना चाहते हैं ताकि उपयोगकर्ता को कुछ स्थितियों के तहत संकेत दिया जा सके।

यहाँ, rmजब ग्लोब मेल नहीं खाता है तो गलत है। sh1 व्यवहार गलत है। यह एक पैटर्न के लिए हानिरहित है *, लेकिन एक के लिए *.[ch], *.[ch]जैसे- जैसे गुजर रहा है, जब यह मेल नहीं खाता *.[ch]है तो गलती से फ़ाइल को हटाया जा सकता है:

$ ls
*.[ch]  foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch]  foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt

एक त्रुटि के साथ विफल करने के लिए सबसे समझदार बात है और क्या zsh(और fish, csh, tcsh, bash -o failglobऔर मूल यूनिक्स शेल) करता है।

और अगर आप उस विशेष मामले की देखभाल करना चाहते हैं, zshतो ऊपर दिए गए मामले (1) की तरह अपने (N)ग्लोब क्वालिफायर ( नोग्लोब के लिए ) को आसान बनाता है । fish(कम से कम हाल के संस्करण में ) इसे और भी आसान बनाता है क्योंकि यह कमांड के लिए एक अंतर्निहित नोग्लोब करता है set। तो, वहाँ के बराबर होगा:

set files *
if count $files > /dev/null
  rm -f -- $files
end

देखें कि अधिक विवरण के लिए nullglob डिफ़ॉल्ट क्यों नहीं है


1 है । सख्ती shसे यह बोर्न शेल (1979 में यूनिक्स V7 के बाद से) के बाद से ही बोल रहा है ; पहले के संस्करणों sh(जिसमें /etc/globअनकॉल्ड वाइल्डकार्ड्स पर कॉल किया गया था , जहां ग्लोब नाम आता है) ने ऐसा व्यवहार किया cshया zsh -o cshnullglob, कि /etc/globकमांड को निरस्त कर देगा यदि किसी भी ग्लोब का कोई मुकाबला नहीं था (और कम से कम मेल नहीं खाने वाले ग्लोब को दबा देगा) उनमें से एक का कोई मुकाबला नहीं था)। बर्नी खोल से व्यवहार टूट गया था ।


मुझे लगता है कि वह rmशेल से त्रुटि संदेश प्राप्त करने की अपेक्षा करता है । "Rm: कुछ हटा नहीं सकता" जैसी कोई चीज़: * ऐसी कोई फ़ाइल या निर्देशिका नहीं है।
इमैनुएल

@ इम्मानुएल, तो वह 2 है: emulate sh -c 'rm -- *'बॉर्न शेल का (छोटी गाड़ी IMO) व्यवहार करने के लिए।
स्टीफन चेज़लस

@Stephane_Chazelas जैसा कि लिखा गया है, 2 एक सवाल का सही जवाब है जो उन्होंने नहीं पूछा :)।
इमैनुएल

@ इमानुएल, सभी 3 प्रश्न का उत्तर देते हैं: "नो मैच" त्रुटि से कैसे छुटकारा पाएं। ओपी का कोड rmत्रुटियों को दबा देता है । जब आप कोई मेल फ़ाइल नहीं है, तो त्रुटि को दबाने के लिए आप अन्य गोले में कुछ करेंगे और यही वास्तविक rm त्रुटियों के दमन का कारण बनता है। मेरा जवाब यह बताता है कि और उम्मीद से पता चलता है कि zsh व्यवहार कितना बेहतर है।
स्टीफन चेजालस 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.