Eşleşen dosya bulunmadığında 0 bulmayı `find` yapabilir miyim?


46

/tmpHiçbir dosya çağrılmamış olsa bile something, onu aramak find0 döndürür:

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

findHiçbir şey bulamadığımda sıfır olmayan bir çıkış durumunu nasıl alabilirim ?

Yanıtlar:


44

İ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 findileri işlemler için çıktılarını da yakalamanız gerekiyorsa , Sven'in cevabı bunu kapsamıştır.


14
Regex *üzerindeki iz egreptamamen gereksizdir. Eğer kullandığınız Since egrepdüzenli ifade sözdizimi, düz eski grepkudreti birkaç mikrosaniye daha hızlı olması.
üçlü

kullanmayı öğrendimfind ... | read
Sam

14

Yazdırılmayan, ancak sonuçlar bulunduğunda 0'dan çıkan en basit çözüm

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

2
Çift tırnak, burada hiçbir işe yaramaz.
haridsv

İkili tırnaklar kod işlevini yerine getirmezken, bir okuyucuya nokta karakterinin bir regex olduğunu ve bir dizin olmadığını açıkça gösterir.
Dharma Bellamkonda

13

Çı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

2
Söyleyebileceğim kadarıyla, bu çalışmıyor. Çıkış kodu koştuğu findherhangi bir çıkış koduna bağlı görünmüyor -exec.
Chris

@Chris benim için çalışıyor ve geri kalan 4 kişi
Steven Penny 15

bu çözümün yanlış yanlış sonucu için örnek: bulun / var olan başlangıç ​​noktası / var olmayan başlangıç ​​noktası adı adı var olan başlangıç ​​noktası -exec false {} +
Gerald Schade

2
Bu doğru çalışır ve belgelenir (bu execbö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).
Tgr

Bu işlevselliğe ihtiyacınız varsa - evet
Gerald Schade

7

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.


Birkaç çözüm (hepsini denemedim) burada Mac üzerinde çalışmadı; bu yaptı.
Alex Hall

5

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

İstenildiği kadar sağlam olmasa da kesinlikle mümkün .
Ruslan

Manuel sayfa zayıf düzenlenmiş; execexecdir+If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Ruslan'un

1

Bunun en özlü ve doğrudan yöntem olduğunu hissediyorum:

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

2
Bu durumda, bir hata varsa, sonucu / dev / null olarak yazdırır, sıfır olmayan bir çıkış döndürür ve ardından test komutuyla 0'a sabitlenir.
Jeff Ferland

Bunun doğru olduğuna inanmıyorum. Lütfen örneğinizi tanımlayın. Bir hata varsa ve çıkı bulursanız, o zaman dizge boş olacak ve sınama sıfırdan dönecektir.
danorton

Örneğinizin ne olabileceğinden emin değilim, ancak -print -quitendişenizi giderebilecek kazara ihmal edildim .
danorton

Belki de düşüren (muhtemelen aynı sebepten ötürü) diğer kişi aksi bir örnek teşkil edebilir mi?
danorton

1
Tamam, sadece tarzımı beğenmedin. Kullanım durumlarım için, bildirebilecek herhangi bir hata ya gürültü ya da başka yerlerde ortaya çıkacakları kadar ciddi olabilir. Her durumda, bu yöntem nihai soruyu doğru bir şekilde cevaplıyor: "Yolda verilen isimde erişilebilir bir dosya var mı?" Bir hata doğru "Hayır" cevabını döndürecektir. Neden olmadığını öğrenmek istersem, burada orjinal olarak cevaplanmayan soruları cevaplayan daha karmaşık bir kod ekleyebilirim.
danorton

0

İş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 0geçirilen findve null üzerinde değişken bölmek, ya da sadece bunun için bir baskı deyimi ekleyebilir.


-1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.