शेल कमांड में क्या होता है। ??


22

निम्नलिखित आदेश होगा tarसब "डॉट" फ़ाइलों और फ़ोल्डरों:

tar -zcvf dotfiles.tar.gz .??*

मैं नियमित अभिव्यक्तियों से परिचित हूं , लेकिन मुझे समझ नहीं आ रहा है कि कैसे व्याख्या की जाए .??*। मैंने निष्पादित किया ls .??*और tree .??*उन फाइलों को देखा जो सूचीबद्ध थीं। इस नियमित अभिव्यक्ति में .उदाहरण के लिए शुरू होने वाले फ़ोल्डर्स के भीतर सभी फाइलें क्यों शामिल हैं ?


1
यह भी देखें unix.stackexchange.com/questions/1168/…
lesmana

जवाबों:


32

दस्ताने नियमित अभिव्यक्ति नहीं हैं। सामान्य तौर पर, शेल कमांड लाइन पर आपके द्वारा टाइप की गई किसी भी चीज़ की व्याख्या करने की कोशिश करेगा जिसे आप एक ग्लोब के रूप में उद्धृत नहीं करते हैं। गोले को नियमित अभिव्यक्ति का समर्थन करने की आवश्यकता नहीं होती है (हालांकि वास्तव में कई कट्टरपंथी अधिक आधुनिक होते हैं, जैसे निर्माण =~में रेक्सक्स मैच ऑपरेटर bash [[)।

.??*एक ग्लोब है। यह किसी भी फ़ाइल नाम से मेल खाता है, जो कि शाब्दिक बिंदु से शुरू होता है ., इसके बाद किसी भी दो (आवश्यक रूप से समान) वर्ण नहीं होते हैं ??, इसके बाद नियमित अभिव्यक्ति के बराबर है [^/]*, अर्थात 0 या अधिक वर्ण जो नहीं हैं /

शेल पथनाम विस्तार ("ग्लोबिंग" के लिए पूरा नाम) के पूर्ण विवरण के लिए, POSIX कल्पना देखें


10
अतिरिक्त बिंदु: यह एक ग्लोब लिखने का एक प्रयास है जो विशेष प्रविष्टियों को छोड़कर एक निर्देशिका में सभी डॉटफाइल्स से मेल खाता है .और .., जो सामान्य रूप से कुछ भी नहीं करना चाहता है। यह बिल्कुल सही नहीं है; यह ' .X' नामक कुछ भी नहीं उठाता है जहाँ X, डॉट के अलावा कुछ वर्ण है। मुझे नहीं लगता कि एक भी ग्लोब लिखना संभव है जो हर डॉटफिल को छोड़कर मेल खाता हो .और .., लेकिन आप इसे दो के साथ कर सकते हैं: tar zcvf dotfiles.tar.gz .[!.] .??*उदाहरण के लिए।
जूल

@Zack: स्पष्टीकरण के लिए धन्यवाद। मैंने उस बारे में एक टिप्पणी पोस्ट की, लेकिन फिर उसे हटा दिया। ls .?उसी के रूप में लौटा ls .., जिसका अर्थ था कि पैटर्न से मेल खाते फ़ोल्डर में कोई अन्य प्रविष्टियाँ नहीं थीं .?। मैं .[^.]के अलावा सभी .?फ़ाइलों के लिए किया होता ..
सब्रेवॉल्फ़ी

2
@ सबेरेवॉल्फी यदि आप पोसिक्स युक्ति को ध्यान से पढ़ते हैं, तो यह वास्तव में ग्लब्स और रेगेक्स के बीच एक महत्वपूर्ण अंतर है: ब्रैकेट अभिव्यक्तियों में, [^abc]रेगेक्स सिंटैक्स में इसका अर्थ [!abc]ग्लोब सिंटैक्स में होता है (जैसे ग्लब्स के ^साथ प्रतिस्थापित किया जाता है !)। [^abc]ग्लोब में स्टाइल सिंटैक्स का उपयोग करना बहुत पोर्टेबल नहीं है क्योंकि पोसिक्स का मतलब यह नहीं है, इसलिए कुछ गोले इसे रेगेक्स-जैसे शब्दार्थ का उपयोग करते हुए व्याख्या करते हैं जबकि अन्य ^केवल एक शाब्दिक चरित्र के रूप में मानते हैं ।
jw013

1
@ jw013: विवरण के लिए धन्यवाद। मुझे वह ग्लोब याद होना चाहिए! =
Regexp

1
यह सिर्फ मेरे लिए हुआ है कि सामान्य मामले में कमांड लाइन .[!.]पर एक शाब्दिक के रूप में छोड़ा जा सकता है tarजहां कोई फाइल नहीं है जो उस पैटर्न से मेल खाती है। कुछ गोले आपको उस व्यवहार को नियंत्रित करने देते हैं, जैसे कि बैश के साथ, shopt -s nullglobयह कमांड लाइन से गायब हो जाएगा यदि यह कुछ भी मेल नहीं खाता है, लेकिन यह एक सार्वभौमिक विशेषता नहीं है।

8

.??*वाइल्डकार्ड ( नहीं एक नियमित अभिव्यक्ति है, हालांकि यह इस तरह दिखता है) फ़ाइल नाम है कि एक अवधि (के साथ शुरू में तब्दील हो .), दो सिंगल वर्ण (जिसके बाद ??अन्य पात्रों के किसी भी संख्या (शून्य या अधिक)), और फिर ( *)।

हो सकता है कि वाइल्डकार्ड ऑन फिलेंम्स में यह पेज मददगार हो।


-1

अन्य उत्तरों में जोड़ने के लिए, एक एकल ?एकल वर्ण फ़ाइल नाम में अनुवाद ??करेगा और उन फ़ाइलनामों से मेल खाएगा जिनमें केवल दो वर्ण हैं और इसी तरह।

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

Downvoter, क्या आप कृपया टिप्पणी कर सकते हैं? सही होने पर खुशी होगी, अगर मैं गलत हूं।
श्री

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