टेस्ट करें कि क्या किसी ग्लोब का कोई मैच बैश में है


223

यदि मैं किसी एकल फ़ाइल के अस्तित्व की जांच करना चाहता हूं, तो मैं इसका उपयोग करके परीक्षण कर सकता हूं test -e filename या[ -e filename ]

माना कि मेरे पास एक ग्लोब है और मैं जानना चाहता हूं कि क्या कोई फाइल मौजूद है, जिनके नाम ग्लोब से मेल खाते हैं। ग्लोब 0 फ़ाइलों (जिस स्थिति में मुझे कुछ भी नहीं करने की आवश्यकता है) से मेल खा सकता है, या यह 1 या अधिक फ़ाइलों (जिस स्थिति में मुझे कुछ करने की आवश्यकता है) से मिलान कर सकता है। मैं कैसे परख सकता हूं कि किसी ग्लोब का कोई मैच है? (मुझे परवाह नहीं है कि कितने मैच हैं, और यह सबसे अच्छा होगा अगर मैं एक ifबयान और बिना छोरों के साथ ऐसा कर सकता हूं (केवल इसलिए कि मुझे वह सबसे पठनीय लगता है)।

( test -e glob*विफल रहता है अगर ग्लोब एक से अधिक फ़ाइल से मेल खाता है।)


3
मुझे संदेह है कि नीचे दिए गए मेरे उत्तर 'स्पष्ट रूप से सही' हैं, जो अन्य सभी तरह के हैक-अराउंड हैं। यह एक-लाइन शेल-बिलिन है जो हमेशा के लिए चारों ओर हो गया है और 'इस विशेष कार्य के लिए इच्छित उपकरण' प्रतीत होता है। मुझे चिंता है कि उपयोगकर्ता गलती से स्वीकार किए गए उत्तर का संदर्भ देंगे। कोई भी मुझे ठीक करने के लिए स्वतंत्र महसूस करता है और मैं अपनी टिप्पणी यहां वापस लूंगा, मैं गलत होने से ज्यादा खुश हूं और इससे सीखता हूं। यदि अंतर इतना कठोर नहीं दिखता, तो मैं इस मुद्दे को नहीं उठाता।
ब्रायन क्रिसमैन

1
इस प्रश्न के लिए मेरा पसंदीदा समाधान खोज कमांड है जो किसी भी शेल (यहां तक ​​कि गैर-बॉर्न शेल) में काम करता है, लेकिन इसके लिए जीएनयू खोजने की आवश्यकता होती है, और कम्पेन कमांड जो स्पष्ट रूप से बैशवाद है। बहुत बुरा मैं दोनों उत्तर स्वीकार नहीं कर सकता।
केन ब्लूम

नोट: यह प्रश्न तब से संपादित किया गया है जब से यह पूछा गया था। मूल शीर्षक "टेस्ट था कि क्या एक ग्लोब किसी भी मैच में है"। विशिष्ट शेल, 'बैश' को मेरे जवाब प्रकाशित करने के बाद प्रश्न से हटा दिया गया था। प्रश्न के शीर्षक का संपादन मेरे उत्तर को त्रुटिपूर्ण बनाता है। मुझे उम्मीद है कि कोई भी इस परिवर्तन को संशोधित या कम से कम संबोधित कर सकता है।
ब्रायन क्रिसमैन

जवाबों:


178

बैश विशिष्ट समाधान:

compgen -G "<glob-pattern>"

पैटर्न से बच जाएं या यह मैचों में पूर्व-विस्तारित हो जाएगा।

बाहर निकलने की स्थिति है:

  • बिना किसी मैच के 1
  • 0 'एक या अधिक मैचों' के लिए

stdoutग्लोब से मेल खाने वाली फ़ाइलों की सूची है ।
मुझे लगता है कि संक्षिप्तता और संभावित दुष्प्रभावों को कम करने के मामले में यह सबसे अच्छा विकल्प है।

अद्यतन : उदाहरण के लिए अनुरोध किया गया।

if compgen -G "/tmp/someFiles*" > /dev/null; then
    echo "Some files exist."
fi

9
ध्यान दें कि compgenएक bash -specific बिल्ट-इन कमांड है और POSIX मानक Unix शेल निर्दिष्ट अंतर्निहित कमांड का हिस्सा नहीं है। pubs.opengroup.org/onlinepubs/9699919799 pubs.opengroup.org/onlinepubs/9699919799/utilities/… इसलिए, इसे उन स्क्रिप्ट्स में उपयोग करने से बचें जहां अन्य गोले के लिए पोर्टेबिलिटी एक चिंता का विषय है।
डायोमिडिस स्पिनेलिस

1
यह मुझे लगता है कि बिना बैश बिल्डिंग्स के एक समान प्रभाव किसी अन्य कमांड का उपयोग करना होगा जो एक ग्लोब पर कार्य करता है और विफल रहता है यदि कोई फाइल मेल नहीं खाती है, जैसे कि एलएस: if ls /tmp/*Files 2>&1 >/dev/null; then echo exists; fi- शायद कोड गोल्फ के लिए उपयोगी है? अगर कोई फ़ाइल ग्लोब के समान है, जिसका ग्लोब से मिलान नहीं होना चाहिए, लेकिन यदि ऐसा है तो संभवतः आपको बड़ी समस्याएं हैं।
डेवी मॉर्गन

4
@DewiMorgan यह सरल है:if ls /tmp/*Files &> /dev/null; then echo exists; fi
क्ले ब्रिज

पर जानकारी के लिए compgen, देखें man bashया साथhelp compgen
अल-teedee

2
हाँ, इसे उद्धृत करें या फ़ाइल नाम वाइल्डकार्ड पूर्व-विस्तारित होगा। compgen "दिर / *। ext"
ब्रायन क्रिसमैन

169

नलग्लोब शेल विकल्प वास्तव में एक बैशवाद है।

थकाऊ स्थिति को बचाने और नलग्लोब स्थिति को बहाल करने की आवश्यकता से बचने के लिए, मैं इसे केवल उसी उपखंड के अंदर स्थापित करूंगा जो ग्लोब का विस्तार करता है:

if test -n "$(shopt -s nullglob; echo glob*)"
then
    echo found
else
    echo not found
fi

बेहतर पोर्टेबिलिटी और अधिक लचीली ग्लोबिंग के लिए, उपयोग खोजें:

if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"
then
    echo found
else
    echo not found
fi

स्पष्ट प्रिंट -quit कार्यों के लिए उपयोग किया जाता है खोजने के डिफ़ॉल्ट अंतर्निहित के बजाय प्रिंट ताकि कार्रवाई खोजने के रूप में यह खोज मानदंड से मिलान पहली फ़ाइल पाता है जैसे ही छोड़ दिया जाएगा। जहाँ बहुत सारी फाइलें मेल खाती हैं, यह echo glob*या तो बहुत तेजी से चलना चाहिएls glob* यह विस्तारित कमांड लाइन को ओवरस्टफ करने की संभावना से भी बचता है (कुछ गोले में 4K लंबाई की सीमा होती है)।

यदि लगता है कि ओवरकिल और मैच की संभावना वाली फाइलों की संख्या छोटी है, तो स्टेट का उपयोग करें:

if stat -t glob* >/dev/null 2>&1
then
    echo found
else
    echo not found
fi

10
findलगता है बिल्कुल सही है। इसका कोई कोना मामला नहीं है, क्योंकि शेल विस्तार नहीं कर रहा है (और कुछ अन्य कमांड में एक अनएक्सपेन्डेड ग्लोब पास कर रहा है), यह शेल के बीच पोर्टेबल है (हालांकि स्पष्ट रूप से आपके द्वारा उपयोग किए जाने वाले सभी विकल्पों में से POSIX द्वारा निर्दिष्ट नहीं किया गया है), और यह इससे भी तेज है ls -d glob*(पिछले स्वीकृत उत्तर) यह पहले मैच तक पहुंचने पर रुक जाता है।
केन ब्लूम

1
ध्यान दें कि इस उत्तर की आवश्यकता हो सकती है shopt -u failglobक्योंकि ये विकल्प किसी भी तरह से संघर्ष करते हैं।
कैलिमो जूल

findसमाधान के रूप में अच्छी तरह से नहीं ग्लोब पात्रों के साथ एक फ़ाइल नाम से मेल खाएगी। इस मामले में, मैं यही चाहता था। हालांकि कुछ के बारे में पता होना चाहिए।
हम

1
चूँकि किसी और ने मेरे जवाब को संपादित करने का फैसला किया, इसलिए यह स्पष्ट है कि
flabdablet

1
unix.stackexchange.com/questions/275637/… इस बात पर चर्चा करता है कि -maxdepthPOSIX खोजने के विकल्प को कैसे बदला जाए।
केन ब्लूम

25
#!/usr/bin/env bash

# If it is set, then an unmatched glob is swept away entirely -- 
# replaced with a set of zero words -- 
# instead of remaining in place as a single word.
shopt -s nullglob

M=(*px)

if [ "${#M[*]}" -ge 1 ]; then
    echo "${#M[*]} matches."
else
    echo "No such files."
fi

2
यह nullglobदेखने के लिए कि क्या कोई एकल परिणाम स्वयं पैटर्न के बराबर है, जाँच करने के बजाय एक संभावित झूठे "कोई मेल नहीं" सेट से बचने के लिए । (उदाहरण के लिए कुछ पैटर्न बिल्कुल पैटर्न ही के बराबर नाम हैं कि मिलान कर सकते हैं a*b, लेकिन जैसे नहीं a?bया [a])।
क्रिस जॉन्सन

मुझे लगता है कि यह अत्यधिक संभावना नहीं है कि वास्तव में ग्लोब की तरह एक फ़ाइल नाम है पर विफल रहता है । (जैसे कोई व्यक्ति भाग गया touch '*py'), लेकिन यह मुझे एक और अच्छी दिशा में इंगित करता है।
केन ब्लूम

मुझे यह सबसे सामान्य संस्करण के रूप में पसंद है।
केन ब्लूम

और सबसे छोटा भी। यदि आप केवल एक मैच की उम्मीद कर रहे हैं, तो आप "$M"शॉर्टहैंड के रूप में उपयोग कर सकते हैं "${M[0]}"। अन्यथा, अच्छी तरह से आपके पास पहले से ही एक सरणी चर में ग्लोब विस्तार है, इसलिए आप उन्हें ग्लोब को फिर से विस्तारित करने के बजाय एक सूची के रूप में अन्य चीजों के लिए इसे पास करने के लिए gtg हैं।
पीटर कॉर्ड्स

अच्छा लगा। आप एम को अधिक तेज़ी से परख सकते हैं (कम बाइट्स और एक [प्रक्रिया के बिना बिना )if [[ $M ]]; then ...
टोबिया

22

मुझे पसंद है

exists() {
    [ -e "$1" ]
}

if exists glob*; then
    echo found
else
    echo not found
fi

यह पठनीय और कुशल दोनों है (जब तक कि बड़ी संख्या में फाइलें न हों)।
मुख्य दोष यह है कि यह जितना दिखता है उससे कहीं अधिक सूक्ष्म है, और मैं कभी-कभी एक लंबी टिप्पणी जोड़ने के लिए मजबूर महसूस करता हूं।
यदि कोई मैच होता है, "glob*"तो शेल द्वारा विस्तारित किया जाता है और सभी मैचों को पास कर दिया जाता है exists(), जो पहले वाले को चेक करता है और बाकी को अनदेखा करता है।
यदि कोई मिलान नहीं है, तो "glob*"इसे पारित कर दिया जाता हैexists() और वहां मौजूद नहीं है।

संपादित करें: एक गलत सकारात्मक हो सकता है, टिप्पणी देखें


13
यदि ग्लोब कुछ ऐसा है, तो *.[cC]उसमें एक गलत पॉजिटिव वापस आ सकता है (हो सकता है cया कोई Cफ़ाइल न हो , लेकिन एक फ़ाइल जिसे कहा जाता है *.[cC]) या झूठी नकारात्मक यदि पहली फ़ाइल जो उस से विस्तारित है, उदाहरण के लिए एक सिम्लिंक एक अनजाने फ़ाइल या किसी फ़ाइल में फ़ाइल के लिए है निर्देशिका जो आपके पास नहीं है (आप जिस तरह से जोड़ना चाहते हैं || [ -L "$1" ])।
स्टीफन चेज़लस

दिलचस्प। शेलचेक की रिपोर्ट है कि ग्लोबिंग केवल तभी काम करता है -e, जब 0 या 1 मैच हो। यह कई मैचों के लिए काम नहीं करता है, क्योंकि यह बन जाएगा [ -e file1 file2 ]और यह विफल हो जाएगा। इसके अलावा परिमाण और सुझाए गए समाधानों के लिए github.com/koalaman/shellcheck/wiki/SC2144 देखें ।
थॉमस प्रिक्सल

10

यदि आपके पास गोलाकार सेट है, तो आप इस पागल का उपयोग कर सकते हैं (जो आपको वास्तव में नहीं करना चाहिए)

shopt -s failglob # exit if * does not match 
( : * ) && echo 0 || echo 1

या

q=( * ) && echo 0 || echo 1

2
एक noop फेल का शानदार उपयोग। कभी भी इस्तेमाल नहीं किया जाना चाहिए ... लेकिन वास्तव में सुंदर। :)
ब्रायन क्रिसमैन

आप दुकान को पेरेन्स के अंदर रख सकते हैं। इस तरह यह केवल परीक्षण को प्रभावित करता है:(shopt -s failglob; : *) 2>/dev/null && echo exists
flabdablet

8

परीक्षण-के पास दुर्भाग्यपूर्ण चेतावनी है कि वह टूटे हुए प्रतीकात्मक लिंक को अस्तित्व में नहीं मानता है। तो आप उन लोगों के लिए भी जाँच कर सकते हैं।

function globexists {
  test -e "$1" -o -L "$1"
}

if globexists glob*; then
    echo found
else
    echo not found
fi

4
यह अभी भी उन फिल्नामों पर झूठे-सकारात्मक को ठीक नहीं करता है जिनके पास ग्लोब विशेष-वर्ण हैं, जैसे स्टीफन चेज़लस डैन बलोच के जवाब के लिए बताते हैं। (जब तक आप नलग्लोब के साथ बंदर न करें)।
पीटर कॉर्ड्स

3
आप से बचने के shoud -oऔर -aमें test/ [। उदाहरण के लिए, यहाँ है, यह विफल रहता है $1है =अधिकांश प्रयोगों के साथ। [ -e "$1" ] || [ -L "$1" ]इसके बजाय उपयोग करें ।
स्टीफन चेजलस

4

उनके विचार के आधार पर कुछ हद तक MYYN के उत्तर को सरल बनाने के लिए:

M=(*py)
if [ -e ${M[0]} ]; then
  echo Found
else
  echo Not Found
fi

4
बंद करें, लेकिन अगर आप मिलान कर रहे हैं [a], तो एक फ़ाइल नाम है [a], लेकिन कोई फ़ाइल नाम नहीं है a? मुझे अब भी इसके लिए पसंद nullglobहै। कुछ लोग इसे पांडित्य के रूप में देख सकते हैं, लेकिन हम उचित होने के साथ-साथ पूरी तरह से सही भी हो सकते हैं।
क्रिस जॉन्सन

@ sondra.kinsey यह गलत है; ग्लोब[a] केवल मैच होना चाहिए a, शाब्दिक फ़ाइल नाम नहीं [a]
ट्रिपल जू

4

Flabdiable के जवाब के आधार पर , मेरे लिए यह सबसे आसान (जरूरी नहीं कि सबसे तेज) जैसा दिखता है, केवल शेल पर ग्लोब विस्तार को छोड़ते हुए खुद को खोजने के लिए उपयोग करना है :

find /some/{p,long-p}ath/with/*globs* -quit &> /dev/null && echo "MATCH"

या ifजैसे:

if find $yourGlob -quit &> /dev/null; then
    echo "MATCH"
else
    echo "NOT-FOUND"
fi

यह बिल्कुल वैसा ही काम करता है जैसा कि मैंने पहले ही स्टेट का उपयोग करके प्रस्तुत किया था; यकीन नहीं है कि स्टेट स्टेट को "आसान" कैसे लगता है।
flabdablet

3
ज्ञात रहे कि &> पुनर्निर्देशन एक बशीवाद है, और चुपचाप अन्य गोले में गलत काम करेगा।
flabdablet

यह flabdablet के findजवाब से बेहतर प्रतीत होता है क्योंकि यह glob में पथ स्वीकार करता है और यह अधिक terse है (इसके लिए आवश्यकता नहीं है -maxdepth)। यह उनके statजवाब से बेहतर भी लगता है क्योंकि यह statप्रत्येक अतिरिक्त ग्लोब मैच पर अतिरिक्त आईएनजी करना जारी नहीं रखता है । मैं सराहना करता हूँ अगर कोई कोने के मामलों में योगदान कर सकता है जहाँ यह काम नहीं करता है।
drwatsoncode

1
भविष्य के विचार के बाद, मैं जोड़ूंगा -maxdepth 0क्योंकि यह शर्तों को जोड़ने में अधिक लचीलापन देता है। उदाहरण के लिए मान लें कि मैं परिणाम को केवल फाइलों के मिलान तक सीमित रखना चाहता हूं। मैं कोशिश कर सकता हूं find $glob -type f -quit, लेकिन यह सच होगा यदि ग्लोब एक फ़ाइल से मेल नहीं खाता है, लेकिन एक निर्देशिका से मेल खाता है जिसमें फ़ाइल (यहां तक ​​कि पुनरावर्ती) भी शामिल है। इसके विपरीत find $glob -maxdepth 0 -type f -quitयदि केवल गोला ही कम से कम एक फ़ाइल से मेल खाता है तो यह सही होगा। ध्यान दें कि maxdepthग्लोब को डायरेक्टरी कंपोनेंट होने से नहीं रोकता है। (FYI 2>पर्याप्त है। कोई ज़रूरत नहीं है &>)
drwatsoncode

2
findपहली जगह का उपयोग करने की बात यह है कि शेल उत्पन्न करने से बचें और ग्लोब मैचों की संभावित विशाल सूची को सॉर्ट करें; find -name ... -quitअधिकांश एक फ़ाइल नाम से मेल खाएगा। यदि कोई स्क्रिप्ट ग्लोब मैचों के शेल-जनरेट की गई सूची को पास करने पर निर्भर करती है find, तो उसे findप्राप्त करने से अनावश्यक प्रक्रिया-स्टार्टअप ओवरहेड के अलावा कुछ भी प्राप्त नहीं होता है। बस गैर-शून्यता के लिए परिणामी सूची का परीक्षण जल्दी और स्पष्ट हो जाएगा।
3

4

मेरे पास अभी एक और उपाय है:

if [ "$(echo glob*)" != 'glob*' ]

यह मेरे लिए अच्छी तरह से काम करता है। क्या कुछ कोने के मामले मुझे याद हैं?


2
अगर फ़ाइल को वास्तव में 'ग्लोब *' नाम दिया गया है तो सिवाय वर्क्स के।
इयान किलिंग सेप

चर के रूप में ग्लोब में पारित करने के लिए काम करता है - एक से अधिक मैच होने पर "बहुत सारे तर्क" त्रुटि देता है। "$ (गूंज $ GLOB)" एक स्ट्रिंग नहीं लौटा रहा है या कम से कम इसे एकल के रूप में व्याख्या नहीं किया गया है, इस प्रकार बहुत सारे तर्क त्रुटि
DKebler

@DKebler: इसकी व्याख्या सिंगल स्ट्रिंग के रूप में की जानी चाहिए, क्योंकि यह डबल-कोट्स में लिपटी है।
user1934428

3

बैश में, आप एक सरणी को ग्लोब कर सकते हैं; यदि ग्लोब मेल नहीं खाता, तो आपके सरणी में एक एकल प्रविष्टि होगी जो किसी मौजूदा फ़ाइल के अनुरूप नहीं है:

#!/bin/bash

shellglob='*.sh'

scripts=($shellglob)

if [ -e "${scripts[0]}" ]
then stat "${scripts[@]}"
fi

नोट: यदि आपने nullglobसेट किया है, तो scriptsएक खाली सरणी होगी, और आपको इसके साथ [ "${scripts[*]}" ]या उसके साथ परीक्षण करना चाहिए [ "${#scripts[*]}" != 0 ]। यदि आप एक पुस्तकालय लिख रहे हैं जो आपके साथ या उसके बिना काम करना चाहिए nullglob, तो आप चाहते हैं

if [ "${scripts[*]}" ] && [ -e "${scripts[0]}" ]

इस दृष्टिकोण का एक फायदा यह है कि आपके पास तब उन फ़ाइलों की सूची होती है, जिनके साथ आप काम करना चाहते हैं, बजाय गोलाकार ऑपरेशन को दोहराने के।


क्यों, नलग्लोब सेट के साथ, और सरणी संभवतः खाली है, क्या आप अभी भी परीक्षण नहीं कर सकते हैं if [ -e "${scripts[0]}" ]...? क्या आप शेल विकल्प संज्ञा सेट की संभावना के लिए भी अनुमति दे रहे हैं ?
जॉनह्रफ

@ जोहान्राफ, हां, मैं आम तौर पर मानती हूं nounset वह सक्रिय है। इसके अलावा, यह (थोड़ा) सस्ता हो सकता है परीक्षण करने के लिए स्ट्रिंग फ़ाइल की उपस्थिति की जांच करने की तुलना में गैर-खाली है। हालांकि, यह देखते हुए कि हमने अभी-अभी एक ग्लोब प्रदर्शन किया है, जिसका अर्थ है कि निर्देशिका सामग्री OS के कैश में ताज़ा होनी चाहिए।
टोबे स्पाइट

1

यह घृणा काम लगती है:

#!/usr/bin/env bash
shopt -s nullglob
if [ "`echo *py`" != "" ]; then
    echo "Glob matched"
else
    echo "Glob did not match"
fi

इसे शायद बाश की जरूरत है, श की नहीं।

यह काम करता है क्योंकि नलग्लोब विकल्प ग्लोब को खाली स्ट्रिंग का मूल्यांकन करने का कारण बनता है अगर कोई मैच नहीं होता है। इस प्रकार इको कमांड से कोई भी गैर-रिक्त आउटपुट इंगित करता है कि ग्लोब कुछ से मेल खाता है।


आप का उपयोग करना चाहिएif [ "`echo *py`" != "*py"]
6

1
यदि फ़ाइल नामक कोई फ़ाइल ठीक से काम नहीं करती *py
रयान सी। थॉम्पसन

यदि कोई फ़ाइल अंत नहीं है py, `echo *py`तो इसका मूल्यांकन किया जाएगा *py
16

1
हां, लेकिन यह ऐसा भी करेगा यदि कोई एकल फ़ाइल है *py, जो गलत परिणाम है।
रयान सी। थॉम्पसन

अगर मैं गलत हूं तो मुझे सुधारें, लेकिन अगर कोई ऐसी फ़ाइल नहीं है जो मेल खाती है *py, तो आपकी स्क्रिप्ट "ग्लोब से मेल खाती हुई" प्रतिध्वनित होगी?
yegle

1

मुझे यह उत्तर दिखाई नहीं दिया, इसलिए मैंने सोचा कि मैं इसे वहाँ रखूँगा:

set -- glob*
[ -f "$1" ] && echo "found $@"

1
set -- glob*
if [ -f "$1" ]; then
  echo "It matched"
fi

व्याख्या

जब कोई मैच नहीं होता है glob*, तो $1इसमें शामिल होगा 'glob*'। परीक्षण -f "$1"सही नहीं होगा क्योंकि glob*फ़ाइल मौजूद नहीं है।

यह विकल्प से बेहतर क्यों है

यह sh और व्युत्पन्न के साथ काम करता है: ksh और bash। यह कोई उप-शेल नहीं बनाता है। $(..)और `...`कमांड एक उप-शेल बनाते हैं; उन्होंने एक प्रक्रिया को कांटा, और इसलिए इस समाधान की तुलना में धीमी हैं।


1

इस तरह से (परीक्षण फ़ाइलें युक्त pattern):

shopt -s nullglob
compgen -W *pattern* &>/dev/null
case $? in
    0) echo "only one file match" ;;
    1) echo "more than one file match" ;;
    2) echo "no file match" ;;
esac

यह इससे कहीं बेहतर है compgen -G: क्योंकि हम अधिक मामलों और अधिक सटीक भेदभाव कर सकते हैं।

केवल एक वाइल्डकार्ड के साथ काम कर सकते हैं *


0
if ls -d $glob > /dev/null 2>&1; then
  echo Found.
else
  echo Not found.
fi

ध्यान दें कि यह बहुत समय हो सकता है यदि बहुत सारे मिलान हैं या फ़ाइल पहुंच धीमी है।


1
यह गलत उत्तर देगा यदि [a]फ़ाइल की तरह एक पैटर्न का उपयोग किया जाता है जब फ़ाइल [a]मौजूद होती है और फ़ाइल aअनुपस्थित होती है। यह कहेंगे कि "पाया गया" भले ही एकमात्र फ़ाइल जिसका मिलान होना चाहिए, aवास्तव में मौजूद नहीं है।
क्रिस जॉन्सन

इस संस्करण को एक सामान्य POSIX / बिन / श (बिना बशीश) के काम करना चाहिए, और इस मामले में कि मुझे इसकी आवश्यकता है, ग्लोब के पास वैसे भी कोष्ठक नहीं हैं, और मुझे उन मामलों के बारे में चिंता करने की आवश्यकता नहीं है जो हैं बहुत पैथोलॉजिकल। लेकिन मुझे लगता है कि परीक्षण करने का कोई अच्छा तरीका नहीं है कि क्या कोई भी फाइल ग्लोब से मेल खाती है।
केन ब्लूम

0
#!/bin/bash
set nullglob
touch /tmp/foo1 /tmp/foo2 /tmp/foo3
FOUND=0
for FILE in /tmp/foo*
do
    FOUND=$((${FOUND} + 1))
done
if [ ${FOUND} -gt 0 ]; then
    echo "I found ${FOUND} matches"
else
    echo "No matches found"
fi

2
जब एक फ़ाइल मेल खाती है तो यह संस्करण विफल हो जाता है, लेकिन आप nullglobशेल विकल्प का उपयोग करके FOUND = -1 कीचड़ से बच सकते हैं ।
केन ब्लूम

@ केन: हम्म, मैं nullglobएक कीचड़ नहीं कहूंगा । मूल पैटर्न के लिए एक एकल परिणाम की तुलना करना एक कीचड़ है (और झूठे परिणामों के लिए प्रवण), उपयोग nullglobनहीं है।
क्रिस जॉन्सन

@ क्रिस: मुझे लगता है कि आप गलत समझते हैं। मैंने फोन नहीं कियाnullglob एक कीचड़ ।
केन ब्लूम

1
@ केन: वास्तव में, मैंने गलत किया था। कृपया मेरी अमान्य आलोचना के लिए मेरी क्षमायाचना स्वीकार करें।
क्रिस जॉन्सन

-1
(ls glob* &>/dev/null && echo Files found) || echo No file found

5
यदि निर्देशिका से मेल खाते हैं glob*और उदाहरण के लिए, उन निर्देशिकाओं को सूचीबद्ध करने के लिए आपके पास लिखने की आवश्यकता नहीं है, तो यह भी गलत होगा ।
स्टीफन चेजलस

-1

ls | grep -q "glob.*"

सबसे कुशल समाधान नहीं (यदि निर्देशिका में फ़ाइलों की एक टन है, तो यह धीमा हो सकता है), लेकिन यह सरल, पढ़ने में आसान है और यह भी लाभ है कि रेगेक्स सादे बैश ग्लोब पैटर्न की तुलना में अधिक शक्तिशाली है।


-2
[ `ls glob* 2>/dev/null | head -n 1` ] && echo true

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