एलएस के साथ असंवेदनशील पैटर्न से मैच कैसे करें?


57

मैं मामले की अनदेखी करते हुए एक निश्चित पैटर्न से मेल खाते सभी फाइलों को सूचीबद्ध करना चाहूंगा।

उदाहरण के लिए, मैं निम्नलिखित कमांड चलाता हूं:

ls *abc*

मैं उन सभी फाइलों को देखना चाहता हूं जिनमें फ़ाइल नाम के एक भाग के रूप में "एबीसी" है, जैसे मामले की अनदेखी करना

-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt

ध्यान दें

मैंने केस के लिए मैन पेज खोजा है, लेकिन कुछ भी नहीं खोज पाया।

जवाबों:


65

यह वास्तव में आपके शेल द्वारा किया जाता है, द्वारा नहीं ls

में bash, आप उपयोग करेंगे:

shopt -s nocaseglob

और फिर अपना कमांड चलाएं।

या में zsh:

unsetopt CASE_GLOB

या यश में:

set +o case-glob

और फिर आपकी आज्ञा।

आप डाल करने के लिए है कि में चाहते हो सकता है .bashrc, .zshrcया .yashrcक्रमशः।

वैकल्पिक रूप से, zsh के साथ:

setopt extendedglob
ls -d -- (#i)*abc*

(यह प्रति-वाइल्डकार्ड आधार पर असंवेदनशील ग्लोबिंग है)

Ksh93 के साथ:

ls -d -- ~(i:*abc*)

आप अलग-अलग काम करने के लिए ग्लोबिंग करना चाहते हैं , न कि ls, क्योंकि वे सभी फाइलें lsशेल द्वारा पास की जाती हैं।


बैश में, मूल सेटिंग पर रीसेट कैसे करें, यदि मैं उपयोग करता हूं shport -s nocaseglob?
एमटीके

6
@ एमटीके: एक विकल्प सेट करने के लिए, आप उपयोग करते हैं shopt -s; को अनसेट यह, आप का उपयोग shopt -u। वैकल्पिक रूप से, आप सब कुछ सबस्क्रिप्शन में लपेट कर उपयोग कर सकते हैं ( )ताकि सेटिंग पैरेंट शेल को प्रभावित न करे (shopt -s nocaseglob ; ls *abc*):।
बरबाद

तो POSIX या SUS में इसके लिए कोई पोर्टेबल तरीका नहीं है या ऐसा कुछ (इसके अलावा [aA][bB][cC]) है?
टिमोथी गुजरात

उत्कृष्ट समाधान, मैं विश्वास नहीं कर सकता कि मैं shoptबैश का उपयोग करने के अंतिम 15 वर्षों में कमान में नहीं आया था !
रेजा सनाई

Jfg956 का उत्तर सही (अगले एक) है। जब आप उसके लिए regexp रखते हैं तो शेल व्यवहार क्यों बदल रहा है?
EnzoR

20

जैसा कि पोलमन द्वारा समझाया गया है, यह शेल (एलएस नहीं) है जो *abc*फाइलों की एक सूची तक फैली हुई है। इसे पैटर्न मैचिंग कहा जाता है ।

मामले को नजरअंदाज करने के लिए पूरे पैटर्न मिलान व्यवहार को बदलने के अलावा, आप पैटर्न के एक और रूप का उपयोग कर सकते हैं *। निम्नलिखित वह काम करेगा जो आप करना चाहते हैं:

ls *[aA][bB][cC]*

मार आदमी से:

[...] संलग्न पात्रों में से किसी एक से मेल खाता है।

यह जहाँ आप इस्तेमाल कर सकते हैं और अधिक ठीक अनाज मिलान की अनुमति देता है *[aA][bB]c*मिलान करने के लिए abcया ABcनहीं बल्कि abCया ABC। या फ्रांसीसी में एक उदाहरण, जहां मैं eचरित्र के सभी उदाहरणों से मेल खाना चाहता हूं :

ls *[eéèêëEÉÈÊË]*

1
दुर्भाग्य से, यह दृष्टिकोण जल्दी से अस्पष्ट हो जाता है क्योंकि पैटर्न लंबा हो जाता है। लेकिन छोटी चीजों के लिए, यह काम करता है।
derobert

@derobert: पूरी तरह से सच है, विशेष रूप से है (और यह शायद मामला है) शेल ने सभी फाइलिंग और मैच अनुरोधों की तुलना करने से पहले निचले मामलों में मिलान अनदेखी मामले को अनुकूलित किया है। हालांकि, [...]कई मामलों में उपयोगी हो सकता है, और मैं हालांकि यह ध्यान देने योग्य था।
jfg956

1
यह सही जवाब है। शेल व्यवहार को बदलना नहीं है।
11

यदि लोकेल ठीक से सेट है, तो आपको समतुल्यता वर्गों का उपयोग करने में सक्षम होना चाहिए [[=e=][=E=]]
बेंजामिन डब्ल्यू।

8

और आउटपुट प्राप्त -iकरने के grepलिए आप (--ignore-case) विकल्प भी जोड़ सकते हैं ।

[root@localhost ~]# ls -l | grep -i abc
-rw-r--r--  1 root root    0 Feb 25 20:41 fileabc.txt
-rw-r--r--  1 root root    0 Feb 25 20:41 fileABC.txt

Grep की तुलना में पैटर्न मिलान का बेहतर प्रदर्शन है क्योंकि grep को सब कुछ इकट्ठा करने और फिर फ़िल्टर करने की आवश्यकता होती है। बड़े फ़ोल्डर के साथ काम करते समय ध्यान देने योग्य अंतर होता है।
ओएमआई

@ इसके अलावा, नियमित रूप से पाठ के लिए विशेष रूप से पाठ की लाइनें हैं। फ़ाइल नाम में नई लाइनें हो सकती हैं।
Kusalananda

3

मुझे नहीं लगता कि यह ls के साथ संभव है, लेकिन आप इसके बजाय इसका उपयोग कर सकते हैं:

find . -maxdepth 1 -iname '*abc*'

0

निम्नलिखित कोड का उपयोग करें:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE

LC_COLLATE चर किसके लिए है? क्या आप आगे बता सकते हैं।
mtk

इस लिंक के बारे में जानने के लिए लिंक पर क्लिक करें
user1678213

0

आप -iअसंवेदनशील विकल्प को जोड़ने वाली फ़ाइल का उपयोग कर सकते हैं।

उदाहरण के लिए दोनों को खोजने के लिए abcऔर ABCआप इस कमांड को चला सकते हैं

    [root@mtk bin]# ls -l | grep -i abc
    640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
    676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt

5
लुइस पेरेज़ मुझे लगता है कि -iआपने कमांड में कहीं भी विकल्प का उपयोग नहीं किया है।
मोंगरेल


-2

Tcsh में,। उपनाम में एक उपनाम सेट करें

alias lsnc "ls BS!* | sort -f "

("बीएस" = एक "बैकस्लैश"; मुझे इसका उपयोग मेरे संस्करण में दिखाने के लिए इसे प्राप्त करने के लिए करना था)।

और के lsncबजाय का उपयोग करेंls

बैश में, .bash_aliases की तरह एक उपनाम की कोशिश करें

lsnc() { ls $1 | sort -f ; }

विकल्पों के साथ ls, उदाहरण के लिए ls -l, यहाँ एक सरल समाधान है:

tcsh:

alias lsncl "ls -l BS!* | sort -f -k 9"

दे घुमा के:

lsncl() { ls -l $1 | sort -f -k 9 ; }

क्या आप सुनिश्चित हैं कि आप =lsnocase के बाद एक ' ' याद नहीं कर रहे हैं ?
एंथन

एंथन: (संशोधित) lsnc और lsncl मेरे लिए tcsh के तहत काम करते हैं और साइगविन और उबंटू दोनों पर बैश होते हैं। ध्यान दें कि बैश के लिए, मैं एक फ़ंक्शन का उपयोग कर रहा हूं, न कि एक "उपनाम" प्रति से। लेस्टर
लेस्टर इंगबर

एंथन: हाँ, आप संभावना का उपयोग कर सकते हैं उपनाम में उर्फ, जैसे कि उर्फ ​​lsncl = 'ls -l $ 1 | Sort -f -k 9 '
Lester Ingber

यह उत्तर उस विशिष्ट प्रश्न को संबोधित नहीं करता है, जो केस-असंवेदनशील के रूप में व्यवहार करने के लिए ls में उत्तीर्ण की गई फाइलों को पास करना चाहता है। यदि शेल बहुत कम फ़ाइलों को पास करता है ls, तो स्थिति को ठीक करने के लिए कुछ भी नहीं है lsऔर sortकर सकते हैं। जैसा कि अन्य उत्तरों में कहा गया है, समस्या को शेल में हल करने की आवश्यकता है, lsसिंटैक्स के साथ नहीं ।
मार्क स्टोसबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.