`खोज` में तारांकन से पहले बैकस्लैश क्यों?


9

इस आदेश में:

find . -name \*.pyc -delete

बैकस्लैश की आवश्यकता पहले क्यों है *.pyc?


इसके लिए मैन पेज findमें एक अनुभाग होना चाहिए जिसे NON-BUGSउदाहरण के रूप में कुछ समान कहा जाता है और इसकी व्याख्या की आवश्यकता है कि इसकी आवश्यकता क्यों है।
ब्रायन

जवाबों:


19

findनिष्पादित किए जाने से पहले खोल द्वारा एक अयोग्य ग्लोब का विस्तार किया जाएगा । ( मैनुअल में फाइलनेम विस्तार का संदर्भ लें ।)

इसलिए कह रहा है:

find . -name *.pyc -delete

वास्तव में निष्पादित करेगा:

find . -name file1.pyc file2.pyc file3.pyc -delete

यह मानते हुए कि वर्तमान निर्देशिका में 3 .pyc फाइलें थीं और इसके बजाय एक त्रुटि हुई।

एक बैकस्लैश शेल को ग्लोब पास करता है find, अर्थात यह ऐसा कार्य करता है जैसे कि *.pycउद्धृत किया गया हो।

आदर्श रूप से, आपको एक ग्लोब को उद्धृत करना चाहिए:

find . -name '*.pyc' -delete

@ रामचम, लेकिन टाइप करते समय अधिक चरित्र।
पॉल ड्रेपर

1
@PaulDraper पढ़ने योग्य और गलतियों की कम संभावना> एक कम्प्रेशर द्वारा शॉर्टर
Doorknob

सिंगल कोट्स जाने का रास्ता है। मैंने कभी सोचा भी नहीं था कि आप बैकस्लैश का इस्तेमाल इस तरह से कर सकते हैं ...
फ्लोरिस

4

आपके शेल findकमांड जारी करने से पहले , यह विभिन्न विस्तार करेगा । ऐसा करने पर, यह विशेष वर्ण (या, विशेष अर्थ वाले वर्ण) को संसाधित करता है, जहां *वाइल्डकार्ड है - एक ग्लोबिंग चरित्र। यह तथाकथित फ़ाइल नाम विस्तार है।

कहो कि आपकी निर्देशिका में दो फाइलें हैं:

  • foo.pyc
  • bar.pyc

फिर *.pycदोनों नामों का विस्तार होगा। इसलिए यदि आप लिखते हैं:

find . -name *.pyc -delete

तब शेल वास्तव में कॉल करेगा:

find . -name foo.pyc bar.pyc -delete

जो बहुत मायने नहीं रखता है, क्योंकि आपके लिए केवल एक तर्क हो सकता है -name। इसलिए आपको शेल द्वारा व्याख्या किए जाने से रोकने के लिए विशेष चरित्र से बचने की आवश्यकता है। आप इसे पीछे छोड़ते हुए या वैकल्पिक रूप से उद्धृत करके करते हैं।

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