Yanıtlar:
İstediğinizi yaptığınıza inandığım tek bir gömlek:
find /tmp -name something | egrep '.*'
Dönüş durumu bir 0
şey bulunduğunda, aksi halde sıfır olmayan durumda olacaktır .
Daha find
ileri işlemler için çıktılarını da yakalamanız gerekiyorsa , Sven'in cevabı bunu kapsamıştır.
find ... | read
Yazdırılmayan, ancak sonuçlar bulunduğunda 0'dan çıkan en basit çözüm
find /tmp -name something | grep -q "."
Çıkış 0 ile bulmak kolaydır, çıkış> 0 daha zordur çünkü bu genellikle bir hata ile gerçekleşir. Ancak bunu gerçekleştirebiliriz:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
herhangi bir çıkış koduna bağlı görünmüyor -exec
.
exec
bölüm gizli olmasına rağmen , geri dönüş değeri altında değildir). Bulunan hiçbir şey arasında ayrım yapmamakta ve kendini hata bulmaktadır (örneğin varolmayan bir başlangıç noktasına çağrıldığında).
Kukla ile ilgili bir sorunu çözmek için yolumu bulmaya çalışırken bu soruyu daha yeni bulduktan sonra (bir dizinin altındaki klasörlerde izinleri değiştirin ancak dizinin kendisinde değil), bu işe yarıyor gibi görünüyor:
! test -z $(find /tmp -name something)
Özel kullanım durumum şudur:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Find komutu gerekli izinlere sahip dosya bulamazsa, kod 1'den çıkar.
Bu mümkün değil. Bul, başarılı bir şekilde çıkarsa, bir dosya bulamamış olsa bile (bu, dosya gerçekten olmadığında bir hataya işaret etmeyen doğru bir sonuçtur), 0 döndürür .
Bulma sayfasını alıntılamak için
ÇIKIŞ DURUMU
Tüm dosyalar başarılı bir şekilde işlenirse 0 durumunda çıkış bul, hatalar olursa 0'dan büyüktür. Bu kasıtlı olarak çok geniş bir tanımdır, ancak geri dönüş değeri sıfır değilse, bulma sonuçlarının doğruluğuna güvenmemelisiniz.
Neyi elde etmek istediğinize bağlı olarak -print
, dosya adını bulmaya ve çıktısına karşı test etmeye çalışabilirsiniz :
#!/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.
Bunun en özlü ve doğrudan yöntem olduğunu hissediyorum:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
endişenizi giderebilecek kazara ihmal edildim .
İşte aradığım küçük bir senaryo test.py
. Eğer ayarlanmışsa, bir hata kodu döndürecek şekilde gönderilen diğer yöntemler üzerinde geliştirilir ve ayrıca herhangi bir dosya listelenmemişse, ayrıca bir taneye ayarlanır:
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)
İşte komut satırı çıktısı:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Ardından, bulma işleminin hata yaptığı, ancak dosyaların bulunduğu bir sonuç için:
$ 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
Eğer dosyaların listesini isterseniz Ardından, yararlanabilir -print 0
geçirilen find
ve null üzerinde değişken bölmek, ya da sadece bunun için bir baskı deyimi ekleyebilir.
find
Çıkış durum kodlarını yalnızca başarılı olduğunda sıfır olarak döndüren de değildir . Unix'te hangi komutu uygularsanız yapın, başarılı olursa çıkış durumunu sıfır olarak döndürür.
*
üzerindeki izegrep
tamamen gereksizdir. Eğer kullandığınız Sinceegrep
düzenli ifade sözdizimi, düz eskigrep
kudreti birkaç mikrosaniye daha hızlı olması.