Zsh में lexicographic क्रम में फ़ाइलों की मल्टीिडिज पर्वतमाला


24

मैं ग्लोबिंग द्वारा zsh में दो पूर्णांकों (जैसे 2 से 57) के साथ फाइलों की एक श्रृंखला (लेक्सिकोग्राफ़िक क्रम में) निर्दिष्ट करना चाहूंगा।

उदाहरण के लिए: "कुछ ग्लोबिंग पैटर्न से मेल खाने वाले पथ के तहत लेक्सिकोग्राफ़िक क्रम में फ़ाइलों को 2 से 57 चुनें"।

मैंने सोचा कि वर्ग कोष्ठक का उपयोग करना होगा

 for x in /foo/bar/*[2-57]; do print $x; done

लेकिन ZSH जाहिरा तौर पर सोचता है कि मैं फ़ाइलों के लिए पूछ रहा हूँ 2करने के लिए 5(या ऐसा ही कुछ) के बजाय फाइलों 2को 57। कोई विचार क्यों? मैं यह कैसे हासिल कर सकता हूं?

जवाबों:


30

[2-57]एक चरित्र से मिलकर सेट है 2, 3, 4, 5और 7वहाँ, zsh और हर दूसरे वाइल्डकार्ड और regexp वाक्य रचना में बाहर। आपका ग्लोब पैटर्न *[2-57]हर फ़ाइल नाम से मेल खाता है जिसका अंतिम चरित्र उन पाँच अंकों में से एक है।

मुझे लगता है कि आप [m,n] ग्लोब क्वालिफायर के सिंटैक्स को गलत बता रहे हैं । ग्लोब क्वालिफायर हमेशा पैटर्न के अंत में कोष्ठक में जाते हैं, और रेंज विभाजक अल्पविराम होता है। पैटर्न *([2,57])2, 3,…, 57 वें मैच तक फैलता है। डिफ़ॉल्ट विस्तार आदेश लेक्सिकोग्राफ़िक है (कुछ विशेष जादू के साथ संख्यात्मक क्रम में संख्याओं को सॉर्ट करने के लिए यदि numeric_glob_sortविकल्प सेट है); आप इसे oया Oग्लोब क्वालिफायर के साथ नियंत्रित कर सकते हैं (उदाहरण के *(om[2,57])लिए हाल के एक फ़ाइल को छोड़कर 57 सबसे हाल की फ़ाइल से मिलान करना)।

for x in /foo/bar/*([2,57]); do print $x; done

भविष्य के पाठकों के लिए आपने जो नहीं पूछा, लेकिन संबंधित और संभवतः उपयोगी: यदि आप फ़ाइलों को 2 से 57 तक एनुमरेट करना चाहते हैं, तो वे मौजूद हैं या नहीं, आप रेंज ब्रेस अभिव्यक्ति का उपयोग कर सकते हैं । यह सुविधा बाश और क्ष में भी मौजूद है।

echo hello{2..57}

और यदि आप उन फ़ाइलों से मेल खाना चाहते हैं जिनके नाम में 2 और 57 के बीच की संख्या है, तो आप पैटर्न का उपयोग कर सकते हैं <2-57>। यह zsh के लिए विशिष्ट है।

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

ध्यान दें कि एक पैटर्न जैसा *<2-57>कि आप अपेक्षा करते हैं वैसा नहीं है, क्योंकि *अंकों का भी मिलान हो सकता है। उदाहरण के लिए, file58से मेल खाता है *<2-57>, साथ file5मिलान *हिस्सा है और 8मिलान <2-57>हिस्सा। पैटर्न *[^0-9]<2-57>इस मुद्दे से बचता है।


तुम सही हो। मैं ग्लोब क्वालिफायर को गलत बता रहा था। सावधान स्पष्टीकरण के लिए धन्यवाद।
एमिलियो वाज़केज़-रीना

वैसे, इस कथन ने मुझे थोड़ा भ्रमित कर दिया if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression:। यदि फ़ाइलें मौजूद नहीं हैं और कोई मिलान नहीं हैं, तो ब्रेस विस्तार का विस्तार कैसे पता चलेगा? (यह ग्लॉब क्वालीफायर से अलग तरीके से कैसे विस्तारित होगा?)
एमिलियो वाज़केज़-रीना

2
@intrpc का foo{8..11}barविस्तार होता है foo8bar foo9bar foo10bar foo11bar। यह बिट विस्तार नाम दर्ज करने के लिए असंबंधित है। इसी तरह, के लिए foo{eight,nine,ten,eleven}barफैलता है fooeightbar fooninebar footenbar fooelevenbar। यह ksh / bash / zsh में ब्रेस विस्तार है।
गाइल्स का SO- बुराई पर रोक '21

6

लेकिन zsh स्पष्ट रूप से सोचता है कि मैं 2 से 57 की फाइलों के बजाय फाइल 2 से 5 (या ऐसा कुछ) पूछ रहा हूं। कोई विचार क्यों?

क्योंकि []कोष्ठक मिलान किए गए वर्णों की एक सूची को इंगित करते हैं (जो अंक हो सकते हैं), न कि गणितीय रूप से व्याख्या की गई संख्या । इस तरह के पैटर्न को एक एकल चरित्र के खिलाफ मिलान किया जाता है । सूची में श्रेणियाँ हो सकती हैं, लेकिन अंक या अक्षर। [2-57]मैच 2 से 5 और 7 के रेंज में "सभी अंकों" तक फैलता है ।

2 से 57 तक संख्याओं का मिलान करने के लिए, ग्लोबिंग पैटर्न (या साथ में) के बजाय अनुक्रम अभिव्यक्ति का उपयोग करना आसान होगा :

for x in /foo/bar/*{2..57}; do print $x; done

संपादित करें : लेकिन यह, दुर्भाग्यवश, आपको सभी सूचीबद्ध फ़ाइलों का शाब्दिक क्रम नहीं देगा - वे शेल विस्तार के कारण सामान्य संख्या अंत द्वारा समूहीकृत होंगे।


धन्यवाद @rozcietrzewiacz! मुझे उसके बारे में सोचना चाहिए था। मेरी फाइलों में उनके नंबर थे, इसलिए एक पल के लिए मुझे लगा कि []चीजों को क्रम में प्रिंट कर रहा है ..
अमेलियो वाज़केज़-रीना

आपकी व्याख्या [2-57]सही है, लेकिन मुझे नहीं लगता {2..57}(कि आपका क्या मतलब है, ठीक है?) इंट्रोपीसी जो करना चाहती है, उसके लिए प्रासंगिक है, जो "फाइलों को लेक्सिकोग्राफिक क्रम में 2 से 57 तक उठाएं" है।
गिल्स एसओ- बुराई को रोकना '19

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