Bu bir sınırlamadır find
. POSIX standardı dönüş durumu belirtir find
bir hata dizinleri sonrasında ise olması koşuluyla, 0; Yürütülen komutların dönüş durumu buna girmez.
Komutların durumlarını bir dosyaya veya bir tanımlayıcıya yazmasını sağlayabilirsiniz:
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"
Keşfettiğiniz gibi başka bir yöntem, xargs kullanmaktır. xargs
Komutlar her zaman tüm dosyaları işler ancak komutların herhangi bir sıfırdan farklı statü dönerse durumunu 1 döndürür.
find … -print0 | xargs -0 -n1 invalid_command
Diğer bir yöntem ise find
kabukta özyinelemeli kürecikten kaçınmak ve kullanmaktır: **/
herhangi bir alt derinliğin derinliği anlamına gelir. Bu sürüm 4 veya bash üstü gerektirir; macOS 3.x sürümünde takılı kaldığından port koleksiyonundan yüklemelisiniz. set -e
Sıfır olmayan bir durum döndüren ilk komuttaki komut dosyasını durdurmak için kullanın .
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done
Bash 4.0 - 4.2 arasında, bunun işe yaradığını ama genellikle arzu edilmeyen dizinlere sembolik bağlar koyduğunu unutmayın.
Eğer bash yerine zsh kullanırsanız özyinelemeli globbing, kutudan çıkarmadan çabuk çalışır. Zsh, OSX / macOS'ta varsayılan olarak bulunur. Zsh ile yazabilirsiniz
set -e
for x in **/*.xml; do invalid_command "$x"; done
xargs
Yaklaşım genel olarak çalışır ama bir türlü üzerinde kırarbash -c
komutları. Örneğin:find . -name '*.xml' -print0 | xargs -0 -n 1 -I '{}' bash -c "foo {}"
. Bu, birkaç kezfind . -name '2*.xml' -print0 | xargs -0 -n 1 -I '{}' foo {}
yürütülürken, bir kez yürütülür ve başarısız olur. Neden bir fikrin var mı?