क्या कोई मिलान फ़ाइल नहीं मिलने पर मैं 'find` return non-0 बना सकता हूँ?


46

यहां तक ​​कि जब /tmpकोई फ़ाइल नहीं होती है something, तो इसके साथ खोजना find0 पर लौटेगा:

  $ find /tmp -name something 
  $ echo $?
  0

जब findमुझे कुछ भी नहीं मिलता है तो मुझे गैर-शून्य निकास स्थिति कैसे मिल सकती है?

जवाबों:


44

यहाँ एक लाइनर है जो मुझे विश्वास है कि आप जो चाहते हैं वह है:

find /tmp -name something | egrep '.*'

वापसी की स्थिति 0तब होगी जब कुछ पाया जाएगा, और गैर-शून्य अन्यथा।

यदि आपको findआगे की प्रक्रिया के लिए आउटपुट पर कब्जा करने की आवश्यकता है , तो स्वेन के जवाब ने इसे कवर किया है।


14
रेगेक्स *पर अनुगामी egrepपूरी तरह से बेमानी है। चूंकि आप egrepरेगुलर एक्सप्रेशन सिंटैक्स का उपयोग नहीं कर रहे हैं , सादे पुराने grepकुछ माइक्रोसेकंड तेजी से हो सकते हैं।
त्रिकाल

मैं उपयोग करने के लिए सीखाfind ... | read
सैम

14

सबसे सरल समाधान जो प्रिंट नहीं करता है, लेकिन परिणाम मिलने पर 0 से बाहर निकलता है

find /tmp -name something | grep -q "."

2
डबल-कोट्स का यहाँ कोई उद्देश्य नहीं है।
१०:१६ पर haridsv

हालांकि दोहरे उद्धरण-चिह्न बिना किसी कोड फ़ंक्शन के काम करते हैं, लेकिन वे एक पाठक को यह स्पष्ट कर देते हैं कि पीरियड कैरेक्टर एक रेगीक्स है न कि डायरेक्टरी।
धर्म बेलमकोंडा

13

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

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

2
जहाँ तक मैं बता सकता हूँ, यह काम नहीं करता है। ऐसा findलगता है कि बाहर निकले किसी भी कोड के निकास कोड पर निर्भर नहीं करता है -exec
क्रिस

@ क्रिस मेरे लिए काम करता है, और 4 जो उत्थान करते हैं
स्टीवन पेनी

इस समाधान के गलत गलत परिणाम के लिए उदाहरण: / मौजूदा-शुरू-बिंदु / गैर-मौजूदा-प्रारंभिक-बिंदु-नाम-फ़ाइल-में-मौजूदा-प्रारंभिक-बिंदु-नेक्सस झूठी {} +
गेराल्ड स्कैड

2
यह सही तरीके से काम करता है, और प्रलेखित है (हालांकि execअनुभाग में छिपा हुआ है , रिटर्न वैल्यू के तहत नहीं)। यह कुछ भी नहीं पाया और खुद को गलत साबित करने के बीच अंतर कर सकता है (जैसे जब यह एक गैर-मौजूद शुरुआती बिंदु पर लागू किया गया था)।
टीआर

यदि आपको इस कार्यक्षमता की आवश्यकता है - हाँ
गेराल्ड स्कैड

7

केवल पुपेट के साथ एक समस्या को हल करने के लिए मेरे रास्ते को खोजने की कोशिश करते हुए इस सवाल का पता लगाने के बाद (एक निर्देशिका के तहत फ़ोल्डर्स पर अनुमतियों को बदलें), लेकिन यह काम करने लगता है:

! test -z $(find /tmp -name something)

मेरा विशिष्ट उपयोग मामला यह है:

! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)

यदि कोड आवश्यक आदेश अनुमतियों के साथ कोई फ़ाइल नहीं पाता है तो कोड 1 से बाहर निकल जाएगा।


कुछ समाधान (उन सभी की कोशिश नहीं की) यहाँ एक मैक पर काम नहीं किया; यह किया।
एलेक्स हॉल

5

यह मुमकिन नहीं है। रिटर्न 0 खोजें अगर यह सफलतापूर्वक बाहर निकालता है, भले ही यह एक फ़ाइल (जो एक सही परिणाम है नहीं मिला नहीं एक त्रुटि दिखाने जब फ़ाइल वास्तव में मौजूद नहीं है)।

खोजने के लिए पेज को उद्धृत करें

बाहर निकलें स्थिति

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

आप जो हासिल करना चाहते हैं, उसके आधार पर -printफाइलनाम और परीक्षण के बारे में जानने की कोशिश कर सकते हैं :

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi

यह निश्चित रूप से संभव है , हालांकि उतना मजबूत नहीं है जितना कोई व्यक्ति चाहता है।
रुस्लान

मैनुअल पेज खराब तरीके से व्यवस्थित है; रुसलान ने जो कहा वह exec/ execdirविकल्प के तहत प्रलेखित है (जिसका उपयोग किया गया है +):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Tgr

1

मुझे लगता है कि यह सबसे संक्षिप्त और प्रत्यक्ष तरीका है:

test `find /tmp/ -name something -print -quit 2>/dev/null`

2
इस स्थिति में, यदि कोई त्रुटि थी, तो यह परिणाम / dev / null को प्रिंट करेगा, एक गैर-शून्य निकास लौटाएगा, और फिर परीक्षण कमांड द्वारा 0 पर नियत किया जाएगा।
जेफ फेरलैंड

मुझे विश्वास नहीं होता कि यह सच है। कृपया अपने उदाहरण का वर्णन करें। यदि कोई त्रुटि है और बाहर निकलता है, तो स्ट्रिंग खाली होगी और परीक्षण गैर-शून्य वापस आ जाएगा।
danorton

मुझे यकीन नहीं है कि आपका उदाहरण क्या हो सकता है, लेकिन मैं गलती से छोड़ दिया गया -print -quit, जो आपकी चिंता का समाधान हो सकता है।
danorton

शायद दूसरा व्यक्ति जिसने (उसी कारण से) अपमानित किया हो, एक विपरीत उदाहरण प्रदान कर सकता है?
डैनॉर्टन

1
ठीक है, आपको मेरी शैली पसंद नहीं है। मेरे उपयोग के मामलों के लिए, रिपोर्ट करने वाली कोई भी त्रुटि या तो शोर या इतनी गंभीर है कि वे कहीं और दिखाएगी। किसी भी मामले में, यह विधि सही तरीके से अंतिम प्रश्न का उत्तर देती है: "क्या दिए गए नाम से मार्ग में एक सुलभ फ़ाइल है।" एक त्रुटि "नहीं" का सही उत्तर देगी। अगर मैं यह जानना चाहता हूं कि क्यों नहीं, मैं और अधिक जटिल कोड जोड़ सकता हूं जो सवालों के जवाब देता है जो मूल रूप से यहां नहीं हैं।
danorton

0

यहाँ एक छोटी स्क्रिप्ट है जिसे मैंने बुलाया है test.py। इसमें पोस्ट किए गए अन्य तरीकों में सुधार होता है, अगर एक सेट किया जाता है तो यह एक त्रुटि कोड लौटाएगा, और यदि कोई फाइल नहीं मिली तो यह एक सेट करता है:

from subprocess import Popen
import sys

p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
    sys.exit(p.returncode)
if not out:
    sys.exit(1)

यहां कमांड-लाइन आउटपुट है:

$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1

फिर, परिणाम के लिए जहां त्रुटियां थीं, लेकिन फ़ाइलें मिलीं:

$ ls -lh
$ d---------  2 jeff users   6 Feb  6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py 
../test.py
$ echo $?
1

फिर, यदि आप फ़ाइलों की सूची चाहते हैं, तो आप -print 0पास किए गए उपयोग findको nulls पर विभाजित कर सकते हैं, या आप इसके लिए एक प्रिंट स्टेटमेंट जोड़ सकते हैं।


-1

यह न केवल findसफल होने पर निकास स्थिति कोड को शून्य के रूप में लौटाता है। यूनिक्स में कभी भी आप जो कमांड निष्पादित करते हैं, यदि वह सफल होता है तो यह निकास स्थिति को शून्य के रूप में वापस करता है।

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