`Ls` और नियमित अभिव्यक्ति के साथ लिस्टिंग


15

मैं अंतिम चरित्र के साथ और .txtविस्तार के साथ फाइलनाम के साथ फ़ाइलों को कैसे सूचीबद्ध कर सकता हूं ?

मैं कोशिश की है ls *+([[:digit:]]).txt, लेकिन इस के लिए सच है abc12.txtऔर abc2.txt

लेकिन मुझे केवल प्राप्त करने की आवश्यकता है abc2.txt। मैं उसे कैसे कर सकता हूँ?

क्या इसका कोई प्रकार है जो :digit:ऐसा करेगा?


2
यह ध्यान दिया जाना चाहिए पैटर्न केवल विस्तारित ग्लोबिंग एंडबल के साथ मान्य है shopt -s extglob:।
donothingsuccessfully

जवाबों:


20

कैसा रहेगा:

ls *[!0-9][0-9].txt

!समूह की शुरुआत में इसका अर्थ का पूरक है।

जैसा कि टिप्पणियों में उल्लेख किया गया है, यह बैश कर रहा है, उदाहरण के लिए प्रयास करें:

printf "%s\n" *[!0-9][0-9].txt

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

3

नियमित अभिव्यक्ति के लिए पूछा गया प्रश्न। बैश, और इस प्रकार ls, यहां नियमित अभिव्यक्तियों का समर्थन नहीं करता है। इसका समर्थन करता है फ़ाइल नाम अभिव्यक्ति ( ग्लोबिंग ), वाइल्डकार्ड का एक रूप है। नियमित अभिव्यक्तियाँ उससे कहीं अधिक शक्तिशाली हैं।

यदि आप वास्तव में नियमित अभिव्यक्ति का उपयोग करना चाहते हैं, तो आप find -regexइस तरह का उपयोग कर सकते हैं :

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'

ढूँढें डिफ़ॉल्ट रूप से पुनरावर्ती है, लेकिन lsऐसा नहीं है। केवल वर्तमान निर्देशिका में फ़ाइलें खोजने के लिए, आप पुनरावृत्ति को अक्षम कर सकते हैं -maxdepth 1। पथ के साथ फ़ाइल नाम के विरुद्ध मैच ढूंढें, यही कारण है कि फ़ाइल नाम ./आपके द्वारा चलाए जाने पर प्रारंभ होता है .। रेगेक्स \./उस के साथ सामना करने के लिए शुरू होता है। ध्यान दें कि regex में, .किसी भी वर्ण से मेल खाने वाला एक विशेष वर्ण है, लेकिन यहाँ हम वास्तव में एक बिंदु चाहते हैं, इसीलिए हम इसे बैकस्लैश के साथ छोड़ देते हैं। हम डॉट इन के लिए भी ऐसा ही करते हैं .txt, क्योंकि रेगेक्स अन्यथा भी मेल खाएगा Atxt। अंकों की कक्षाएं ग्लोबिंग के लिए समान होती हैं, बस आपको चरित्र वर्ग को पलटने के ^बजाय उसकी आवश्यकता होती है !

यदि आप आउटपुट प्राप्त करना चाहते हैं ls, तो आप -exec lsइस तरह का उपयोग कर सकते हैं :

 find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;

findविभिन्न regex जायके के एक जोड़े का समर्थन करता है। आप एक -regextypeउदाहरण के लिए निर्दिष्ट कर सकते हैं :

find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'

मेरे लिए, संभावित प्रकार हैं: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'पॉज़िक्स-एंग्रेप', 'पॉज़िक्स-एक्सटेंडेड', 'पॉज़िक्स-मिनिमम-बेसिक', 'सेड' आप यह find -regextype helpजानने के लिए दौड़ सकते हैं कि आपके सिस्टम में क्या सपोर्ट है।


0

साथ ksh बढ़ाया globs (या bash -O extglobया zsh -o kshglob) है कि आप पहले से ही उपयोग कर रहे हैं, कि होगा:

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

या

ls -d -- !(*[[:digit:]])[[:digit:]].txt

आप पर मेल करना चाहते हैं a1.txt और2.txt नहीं बल्कि a12.txtऔर न ही 12.txt

हालाँकि, ध्यान दें कि ksh और bash में (जब तक कि आप failglobzsh के समान व्यवहार प्राप्त करने के लिए विकल्प सेट नहीं करते हैं ), यदि वह पैटर्न किसी भी फ़ाइल से मेल नहीं खाता है, तो पैटर्न शाब्दिक रूप से पास हो जाएगा ls, और यदि वह (अजीब तरह से नामित) फ़ाइल में होता है मौजूद है, lsभले ही यह पैटर्न से मेल नहीं खाता हो, फिर भी इसे सूचीबद्ध किया जाएगा ।

शामिल करने के लिए .2.txt, सेट dotglobमें विकल्प bash, जोड़ने (D)में ग्लोब क्वालीफायर zsh, या सेट FIGNOREकरने के लिए !(.|..)में ksh93

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