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


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.