यह एक सीमा है find। POSIX मानक निर्दिष्ट करता है कि वापसी की स्थिति find जब तक निर्देशिकाओं को ट्रेस करते समय कोई त्रुटि नहीं हुई है; निष्पादित आदेशों की वापसी स्थिति इसमें दर्ज नहीं होती है।
आप कमांड को फ़ाइल या डिस्क्रिप्टर पर अपनी स्थिति लिख सकते हैं:
find_status_file=$(mktemp findstatus)
: >"$find_status_file"
find … -exec sh -c 'trap "echo \$?" EXIT; invalid_command "$0"' {} \;
if [ -s "$find_status_file" ]; then
echo 1>&2 "An error occurred"
fi
rm -f "$find_status_file"
एक अन्य विधि, जैसा आपने खोजा था , xargs का उपयोग करना है। xargs कमांड हमेशा सभी फाइलों को प्रोसेस करता है, लेकिन यदि कोई भी कमांड नॉनजेरो स्टेटस देता है, तो स्टेटस 1 को लौटा देता है।
find … -print0 | xargs -0 -n1 invalid_command
फिर भी एक और तरीका बचना है find और इसके बजाय शेल में पुनरावर्ती ग्लोबिंग का उपयोग करें: **/ उपनिर्देशिकाओं की किसी भी गहराई का मतलब है। इसके लिए संस्करण 4 या बैश के ऊपर की आवश्यकता होती है; macOS 3.x संस्करण पर अटका हुआ है, इसलिए आपको इसे पोर्ट संग्रह से इंस्टॉल करना होगा। उपयोग set -e पहले कमांड पर स्क्रिप्ट को रोकना एक गैर-स्थिति को वापस करना
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done
खबरदार कि 4.2 के माध्यम से 4.0 में, यह काम करता है लेकिन निर्देशिकाओं के प्रतीकात्मक लिंक का पता लगाता है, जो आमतौर पर वांछनीय नहीं है।
यदि आप बैश के बजाय zsh का उपयोग करते हैं, तो पुनरावर्ती ग्लोबिंग बिना किसी गोच के बॉक्स से बाहर काम करता है। Zsh डिफ़ॉल्ट रूप से OSX / macOS पर उपलब्ध है। Zsh में, आप बस लिख सकते हैं
set -e
for x in **/*.xml; do invalid_command "$x"; done