जवाबों:
यहाँ एक लाइनर है जो मुझे विश्वास है कि आप जो चाहते हैं वह है:
find /tmp -name something | egrep '.*'
वापसी की स्थिति 0
तब होगी जब कुछ पाया जाएगा, और गैर-शून्य अन्यथा।
यदि आपको find
आगे की प्रक्रिया के लिए आउटपुट पर कब्जा करने की आवश्यकता है , तो स्वेन के जवाब ने इसे कवर किया है।
find ... | read
सबसे सरल समाधान जो प्रिंट नहीं करता है, लेकिन परिणाम मिलने पर 0 से बाहर निकलता है
find /tmp -name something | grep -q "."
बाहर निकलें 0 को ढूंढना आसान है, बाहर निकलना> 0 कठिन है क्योंकि यह आमतौर पर केवल एक त्रुटि के साथ होता है। हालाँकि हम ऐसा कर सकते हैं:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
लगता है कि बाहर निकले किसी भी कोड के निकास कोड पर निर्भर नहीं करता है -exec
।
exec
अनुभाग में छिपा हुआ है , रिटर्न वैल्यू के तहत नहीं)। यह कुछ भी नहीं पाया और खुद को गलत साबित करने के बीच अंतर कर सकता है (जैसे जब यह एक गैर-मौजूद शुरुआती बिंदु पर लागू किया गया था)।
केवल पुपेट के साथ एक समस्या को हल करने के लिए मेरे रास्ते को खोजने की कोशिश करते हुए इस सवाल का पता लगाने के बाद (एक निर्देशिका के तहत फ़ोल्डर्स पर अनुमतियों को बदलें), लेकिन यह काम करने लगता है:
! test -z $(find /tmp -name something)
मेरा विशिष्ट उपयोग मामला यह है:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
यदि कोड आवश्यक आदेश अनुमतियों के साथ कोई फ़ाइल नहीं पाता है तो कोड 1 से बाहर निकल जाएगा।
यह मुमकिन नहीं है। रिटर्न 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.
मुझे लगता है कि यह सबसे संक्षिप्त और प्रत्यक्ष तरीका है:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, जो आपकी चिंता का समाधान हो सकता है।
यहाँ एक छोटी स्क्रिप्ट है जिसे मैंने बुलाया है 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 पर विभाजित कर सकते हैं, या आप इसके लिए एक प्रिंट स्टेटमेंट जोड़ सकते हैं।
यह न केवल find
सफल होने पर निकास स्थिति कोड को शून्य के रूप में लौटाता है। यूनिक्स में कभी भी आप जो कमांड निष्पादित करते हैं, यदि वह सफल होता है तो यह निकास स्थिति को शून्य के रूप में वापस करता है।
*
पर अनुगामीegrep
पूरी तरह से बेमानी है। चूंकि आपegrep
रेगुलर एक्सप्रेशन सिंटैक्स का उपयोग नहीं कर रहे हैं , सादे पुरानेgrep
कुछ माइक्रोसेकंड तेजी से हो सकते हैं।