बैश ग्लोबस्टार मिलान


18

मेरे पास यह निर्देशिका संरचना है:

~/tmp/globstar ɀ  find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

और, globstarबाश में सक्षम विकल्प के साथ , मैं कह सकता हूं:

~/tmp/globstar ɀ  ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

मेरा प्रश्न है: dir/file.extइस सूची से बाहर क्यों रखा गया है?

बैश मैनुअल इस बारे में कहते हैं globstar:

यदि सेट किया जाता है, तो फ़ाइल नाम विस्तार संदर्भ में उपयोग किया जाने वाला पैटर्न '**' सभी फाइलों और शून्य या अधिक निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएगा। यदि पैटर्न '/' द्वारा अनुसरण किया जाता है, तो केवल निर्देशिकाएं और उपनिर्देशिकाएं मेल खाती हैं।

इस पैराग्राफ में " शून्य " मुझे उस छाप के साथ आने देना dir/file.extचाहिए जिसे शामिल किया जाना चाहिए था; जब तक मैं उम्मीद नहीं कर रहा हूँ कुछ याद आ रही है।


2
यह चरित्र क्या है? ɀ?
— slm

2
बैश का क्या संस्करण, किस मंच पर? मैं इसे डेबियन व्हीज़ पर 4.2.37 बैश या डेबियन निचोड़ पर 4.1.5 बैश के साथ पुन: पेश नहीं कर सकता। @ एसएलएम unicode ɀया विकिपीडिया
— गाइल्स '

1
@ गिल्स कि एक संकेत है?
— स्लम

5
एसएलएम, हाँ! ɀबस एक चरित्र है जो यहाँ तुरंत संकेत देने के लिए उपयोग किया जाता है। कुछ उपयोगकर्ता चरित्र पसंद करते हैं £या :) के €बजाय $। मूल रूप से, ɀएक विशेष अफ्रीकी भाषा संकेतन के लिए बनाया गया 'z' वर्ण :-)
— Slyx

1
"GNU बैश, संस्करण 3.2.53 (1) -release (x86_64-apple-darwin13)" OS X 10.9 के साथ शिप किया गया है।
— natevw

जवाबों:


8

मुझे लगता है कि केवल उपनिर्देशिका स्तर को संदर्भित करता है। **बिना /मिलान के

  1. सभी फाइलें और निर्देशिका

  2. शून्य या अधिक उपनिर्देशिका

लेकिन यह पूरी तरह से गायब नहीं होता है। **/इसका मतलब है कि उच्चतम-स्तरीय निर्देशिका में कोई भी फाइल जो **मेल नहीं खाती है।

आपको जरूरत है dir/*.ext dir/**/*.ext।


हाँ, यह वास्तव में मेरी वापसी है, यह सिर्फ सुंदर नहीं लगती है। ;-)
— व्लाद गुड़िगा

10

यह आपको बश के इन संस्करणों में अपेक्षा के अनुसार काम करता है जैसा कि सूचीबद्ध वितरण के साथ दिया गया है:

  • 4.1.2 (1) - सेंटोस 6.5
  • 4.1.5 (1) - डेबियन 6.0.10
  • 4.1.10 (4) - सिगविन 1.7.31
  • 4.2.46 (1) - सेंटोस 7.1
  • 4.3.11 (1) - उबंटू 14.04.1
  • 4.3.30 (1) - डेबियन 8.1

वास्तव में ऊपर सूचीबद्ध संस्करण वे सभी हैं जिन्हें मैंने परीक्षण किया था। दूसरे शब्दों में मुझे बैश का एक संस्करण 4 नहीं मिला जहां यह काम नहीं करता है। विकल्प globstarको Bash 4.0 में CHANGES देखें में जोड़ा गया था । पुराने संस्करणों में कमांड shopt -s globstarको एक त्रुटि वापस करनी चाहिए।

टेस्ट

1. dir/**/*.ext मैच dir/file.ext:

~/tests$ ls -1 dir/**/*.ext
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

2. **/*.ext मैच file.ext:

~/tests$ cd dir
~/tests/dir$ ls -1 **/*.ext
file.ext
subdir1/file.ext
subdir2/file.ext

उपरोक्त परीक्षणों को पुन: प्रस्तुत करने के लिए वातावरण तैयार करना :

mkdir -p dir/subdir{1,2}
touch dir/{,subdir{1,2}/}file.ext
shopt -s globstar

2
यह सही जवाब है। ओपी सेट करना भूल गया shopt -s globstar।
— सीएस पेई

5

मुझे ऐसा लग रहा है जैसे आपने ग्लोबस्टार को बंद कर दिया है। इसे इस तरह चालू किया जा सकता है:

shopt -s globstar

यह न केवल शून्य उपनिर्देशिकाओं से मेल खाएगा, बल्कि यह दो उपनिर्देशिकाओं से भी मेल नहीं खाएगा:

$ find dir -type f #the same as yours except with a directory inside one of the subdirectories
dir/file.ext
dir/subdir1/file.ext
dir/subdir1/subsubdir/file.ext
dir/subdir2/file.ext
$ shopt -u globstar #turn globstar off
$ #will only show files in subdirectories
$ #will not show files in dir or in subsubdir
$ echo dir/**/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
$ shopt -s globstar #turn globstar on
$ #will show all four files
$ echo dir/**/*.ext
dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext

ग्लोबस्टार बंद होने के साथ, ** केवल * की तरह व्यवहार करना समाप्त कर देता है, इसलिए dir/**/*.extजैसा परिणाम मिलता हैdir/*/*.ext

$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext

जो कभी-कभी मुझे सोच-समझकर परेशान करता है

अपने वर्तमान ग्लोबस्टार सेटिंग को इस तरह जांचें:

shopt | grep globstar

1
आप सीधे शेल विकल्प की जाँच कर सकते हैं shopt globstar।
— बेंजामिन डब्ल्यू।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.