कैसे पता लगाएं कि "खोज" में कोई मैच मिला?


16

क्या यह पता लगाने के लिए एक मुहावरेदार साधन है कि क्या "मिल" किसी भी मैच को मिला? मैं वर्तमान में उपयोग कर रहा हूं

COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then

लेकिन यह मुझे थोड़ा अप्रत्यक्ष लगता है। इसके अलावा, मैं एक बार मैच देखने के बाद उसे खोजना बंद कर दूंगा, इसलिए यह समय और प्रयास बर्बाद नहीं करता है। मुझे बस यह जानने की जरूरत है कि मैच करने वाली कोई फाइल है या नहीं।

अद्यतन: मैंने मेरे सामने कोड के बिना अपना प्रश्न लिखने की गलती की: मैं wc -lएक अलग मामले में उपयोग करता हूं , जहां मुझे किसी भी तरह मिली फ़ाइलों की कुल संख्या जानने की आवश्यकता है। इस मामले में जहां मैं केवल इस बात के लिए परीक्षण कर रहा हूं कि क्या कोई मैच है, मैं उपयोग कर रहा था if [ -z $(find …) ]

जवाबों:


17

यदि आपको पता है कि आपके पास जीएनयू है, -quit तो पहले मैच के बाद इसे बंद करने के लिए उपयोग करें।

Portably, पाइप के उत्पादन findमें head -n 1। इस तरह findसे कुछ मैचों (जब यह headइनपुट बफर भर जाता है ) के बाद एक टूटी हुई पाइप से मर जाएगा ।

किसी भी तरह से, आपको यह wcपरीक्षण करने की आवश्यकता नहीं है कि क्या एक स्ट्रिंग खाली है, शेल इसे अपने दम पर कर सकता है।

if [ -n "$(find … | head -n 1)" ]; then …

दिलचस्प ... मैंने सोचा कि -nकेवल 'परिभाषित' चर ($ abc, $ xyz, आदि) पर लागू होता है, लेकिन मुझे लगता है कि $ (...) एक 'परिभाषित' अस्थायी चर है ... +1 ... (और मैं सिर्फ हाल ही में पढ़ा कि -nजोखिम भरा है, जब तक आप सुनिश्चित नहीं हैं कि चर पहले ही घोषित नहीं किया गया है और 'अप्रयुक्त' है ... लेकिन एक अस्थायी इस संभावना नहीं होगी ... यानी।
एकतरफा

2
@fred: इसके विपरीत, -nपरीक्षण करता है कि क्या एक स्ट्रिंग खाली है, इसका चर से कोई लेना-देना नहीं है। आपने जो पढ़ा है, वह शायद कह रहा था कि -nयह परीक्षण नहीं करता है कि एक चर परिभाषित किया गया है: -n "$foo"गलत है अगर fooपरिभाषित लेकिन खाली है, और एक त्रुटि संदेश प्रदर्शित करता है set -u[ -n "${foo+1}" ]मज़बूती से परीक्षण करता fooहै कि क्या सेट है, लेकिन खाली और परेशान वैरिएबल को पहचानना आमतौर पर एक अच्छा विचार है: [ -n "${foo:+1}" ]या सिर्फ [ -n "$foo" ]अगर आप चिंतित हैं तो set -u
गिलेस एसओ- बुराई को रोकना '27

धन्यवाद! मेरे पास -quitउपलब्ध नहीं है , लेकिन head -n 1काम करने के लिए पाइपिंग (जैसा कि करता है head -c 1, जो पहले भी बंद हो जाता है, लेकिन शायद नगण्य लाभ के साथ)। इसके अलावा, मैंने मेरे सामने कोड के बिना अपने प्रश्न को लिखने की गलती की: मैं wc -lएक अलग मामले में उपयोग करता हूं , जहां मुझे कुल फ़ाइलों की संख्या जानने की आवश्यकता है। इस मामले में जहां मैं केवल इस बात के लिए परीक्षण कर रहा हूं कि क्या कोई मैच है, मैं उपयोग कर रहा था if [ -z `find … ` ]
क्रिस पेज

6

आप -quitपहले मैच के बाद रुकने के लिए क्रिया का उपयोग कर सकते हैं । आप शायद एक और कार्रवाई (जैसे -print) के साथ संयोजन करना चाहते हैं या आप यह नहीं बता पाएंगे कि यह कुछ भी मिला।

उदाहरण के लिए, find ... -print -quitपहली मिलान फ़ाइल का पथ प्रिंट करेगा और फिर बाहर निकल जाएगा। या, आप -printf 1 -quit1 प्रिंट करने के लिए उपयोग कर सकते हैं यदि एक मैच है और कुछ नहीं है अगर वहाँ नहीं है।

findबाहर निकलने की स्थिति यह दर्शाती है कि खोज करते समय त्रुटियां थीं या नहीं और क्या यह कुछ भी पाया गया है, इसलिए आपको यह देखने के लिए कि क्या कोई मैच है, इसके आउटपुट को जांचना है।


-quitएक GNU एक्सटेंशन है। यह OS (BS), BSD, और शायद सबसे अधिक व्यावसायिक यूनियनों जैसे खोज (1) के अन्य कार्यान्वयन का उपयोग करने वाले सिस्टम पर काम नहीं करेगा।
वॉरेन यंग

धन्यवाद, यह जानने के लिए उपयोगी है कि मैं किसी अन्य प्रणाली का उपयोग कर रहा हूं। दुर्भाग्य से, न तो -क्विट और न ही -प्रिंट मेरा (मैक ओएस एक्स) पर उपलब्ध हैं।
क्रिस पेज

4

बाहर निकलें 0 को ढूंढना आसान है, बाहर निकलना> 0 कठिन है क्योंकि यह आमतौर पर केवल एक त्रुटि के साथ होता है। हालाँकि हम इसे कर सकते हैं:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

ध्यान दें कि यह समाधान एक उप-प्रकार का उपयोग करने से अधिक निष्पादन योग्य है; झूठे को फांसी देने से भी निश्चित रूप से तेज है डैश:

$ cat alfa.sh bravo.sh charlie.sh delta.sh
find -name non-existing-file -exec false {} +
find -name existing-file -exec false {} +
[ "$(find -name non-existing-file)" ]
[ "$(find -name existing-file)" ]

$ strace dash alfa.sh | wc -l
807

$ strace dash bravo.sh | wc -l
1141

$ strace dash charlie.sh | wc -l
1184

$ strace dash delta.sh | wc -l
1194

0

आप इसे शेल स्थिति में लपेट सकते हैं, जैसे:

[ "$(find . ...)" '!=' '' ] && echo Found || echo Not found

...आपकी मैच की स्थिति कहां है, उदा -name *.txt

कुछ अन्य उदाहरण:

[ "$(find /etc -name hosts)" ] && echo True || echo False
[ ! -z "$(find /etc -name hosts)" ] && echo True || echo False
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.