Bisakah saya membuat `find` kembali non-0 ketika tidak ada file yang cocok ditemukan?


46

Bahkan ketika /tmptidak ada file yang dipanggil something, mencarinya dengan findakan mengembalikan 0:

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

Bagaimana saya bisa mendapatkan status keluar non-nol ketika findtidak menemukan apa pun?

Jawaban:


44

Berikut ini adalah satu-baris yang saya yakini melakukan apa yang Anda inginkan:

find /tmp -name something | egrep '.*'

Status pengembalian akan 0ketika sesuatu ditemukan, dan bukan nol sebaliknya.

Jika Anda juga perlu menangkap output finduntuk diproses lebih lanjut, maka jawaban Sven telah membahasnya.


14
Jejak *pada egrepregex sepenuhnya mubazir. Karena Anda tidak menggunakan egrepsintaks ekspresi reguler, plain old grepmungkin beberapa mikrodetik lebih cepat.
tripleee

saya belajar menggunakanfind ... | read
Sam

14

Solusi paling sederhana yang tidak mencetak, tetapi keluar 0 ketika hasil ditemukan

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

2
Kutipan ganda tidak ada gunanya di sini.
haridsv

Sementara tanda kutip ganda tidak berfungsi fungsi kode, mereka membuatnya lebih jelas bagi pembaca bahwa karakter periode adalah regex dan bukan direktori.
Dharma Bellamkonda

13

Keluar 0 mudah dengan menemukan, keluar> 0 lebih sulit karena biasanya hanya terjadi dengan kesalahan. Namun kita dapat mewujudkannya:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

2
Sejauh yang saya tahu, ini tidak berhasil. Kode keluar findsepertinya tidak tergantung pada kode keluar dari apa pun -execitu berlari.
Chris

@ Chris bekerja untuk saya, dan 4 yang terpilih
Steven Penny

contoh untuk hasil yang salah dari solusi ini: temukan / ada-titik-mulai / tidak-ada-titik-mulai-nama file-di-titik-ada-mulai-salah -exec palsu {} +
Gerald Schade

2
Ini berfungsi dengan benar, dan didokumentasikan (meskipun tersembunyi di execbagian ini, tidak di bawah nilai balik). Itu tidak dapat membedakan antara tidak ada yang ditemukan dan menemukan dirinya kesalahan keluar (misalnya ketika itu dipanggil pada titik awal yang tidak ada).
Tgr

Jika Anda memerlukan fungsi ini - ya
Gerald Schade

7

Baru saja menemukan pertanyaan ini ketika mencoba menemukan cara saya untuk memecahkan masalah dengan Wayang (ubah izin pada folder di bawah direktori tetapi tidak pada direktori itu sendiri), ini sepertinya berfungsi:

! test -z $(find /tmp -name something)

Kasus penggunaan spesifik saya adalah ini:

! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)

Yang akan keluar dari kode 1 jika perintah find tidak menemukan file dengan izin yang diperlukan.


Beberapa solusi (tidak mencoba semuanya) di sini tidak bekerja pada Mac; ini berhasil.
Alex Hall

5

Itu tidak mungkin. Temukan pengembalian 0 jika berhasil keluar, bahkan jika itu tidak menemukan file (yang merupakan hasil yang benar tidak menunjukkan kesalahan ketika file memang tidak ada).

Mengutip halaman manual find

EXIT STATUS

temukan pintu keluar dengan status 0 jika semua file berhasil diproses, lebih besar dari 0 jika terjadi kesalahan. Ini memang deskripsi yang sangat luas, tetapi jika nilai baliknya bukan nol, Anda sebaiknya tidak mengandalkan kebenaran hasil temuan.

Bergantung pada apa yang ingin Anda capai, Anda bisa mencoba mencari -printnama file dan menguji outputnya:

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi

Ini tentu saja mungkin , meskipun tidak sekuat yang diinginkan.
Ruslan

Halaman manual tidak tertata dengan baik; apa yang dikatakan Ruslan didokumentasikan di bawah opsi exec/ execdir(digunakan dengan +):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Tgr

1

Saya merasa bahwa ini adalah metode yang paling ringkas dan langsung:

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

2
Dalam hal ini, jika menemukan memiliki kesalahan itu akan mencetak hasilnya ke / dev / null, mengembalikan jalan keluar nol, dan kemudian diperbaiki ke 0 oleh perintah tes.
Jeff Ferland

Saya tidak percaya itu benar. Tolong jelaskan contoh Anda. Jika ada kesalahan dan menemukan keluar, maka string akan kosong dan tes akan mengembalikan bukan nol.
danorton

Saya tidak yakin apa contoh Anda, tetapi saya tidak sengaja -print -quitmenghapusnya, yang mungkin menjawab kekhawatiran Anda.
danorton

Mungkin orang lain yang menurunkan peringkat (mungkin karena alasan yang sama) dapat memberikan contoh sebaliknya?
danorton

1
Oke, kamu tidak suka gayaku. Untuk kasus penggunaan saya, setiap kesalahan yang ditemukan mungkin melaporkan kebisingan atau sangat serius sehingga mereka akan muncul di tempat lain. Bagaimanapun, metode ini dengan benar menjawab pertanyaan pamungkas: "Apakah ada file yang dapat diakses di jalur dengan nama yang diberikan." Kesalahan akan mengembalikan jawaban yang benar dari "Tidak". Jika saya ingin mencari tahu mengapa tidak, saya dapat menambahkan kode yang lebih kompleks yang menjawab pertanyaan yang tidak diajukan sebelumnya di sini.
danorton

0

Ini skrip kecil yang saya panggil test.py. Ini meningkatkan metode lain yang diposting di itu akan mengembalikan kode kesalahan jika ada yang diatur, dan itu juga menetapkan jika ditemukan tidak mencantumkan file:

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)

Inilah output baris perintah:

$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1

Kemudian, untuk hasil di mana ditemukan memiliki kesalahan tetapi menemukan file:

$ 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

Kemudian, jika Anda ingin daftar file Anda dapat menggunakan -print 0diteruskan ke finddan membagi variabel keluar pada nol, atau Anda bisa menambahkan pernyataan cetak untuk itu.


-1

Bukan hanya finditu mengembalikan kode status keluar sebagai nol ketika berhasil. Dalam unix apa pun perintah yang Anda jalankan, jika berhasil maka mengembalikan status keluar sebagai nol.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.