Jawaban:
Berikut ini adalah satu-baris yang saya yakini melakukan apa yang Anda inginkan:
find /tmp -name something | egrep '.*'
Status pengembalian akan 0
ketika sesuatu ditemukan, dan bukan nol sebaliknya.
Jika Anda juga perlu menangkap output find
untuk diproses lebih lanjut, maka jawaban Sven telah membahasnya.
find ... | read
Solusi paling sederhana yang tidak mencetak, tetapi keluar 0 ketika hasil ditemukan
find /tmp -name something | grep -q "."
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
find
sepertinya tidak tergantung pada kode keluar dari apa pun -exec
itu berlari.
exec
bagian 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).
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.
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 -print
nama file dan menguji outputnya:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(digunakan dengan +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Saya merasa bahwa ini adalah metode yang paling ringkas dan langsung:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
menghapusnya, yang mungkin menjawab kekhawatiran Anda.
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 0
diteruskan ke find
dan membagi variabel keluar pada nol, atau Anda bisa menambahkan pernyataan cetak untuk itu.
Bukan hanya find
itu mengembalikan kode status keluar sebagai nol ketika berhasil. Dalam unix apa pun perintah yang Anda jalankan, jika berhasil maka mengembalikan status keluar sebagai nol.
*
padaegrep
regex sepenuhnya mubazir. Karena Anda tidak menggunakanegrep
sintaks ekspresi reguler, plain oldgrep
mungkin beberapa mikrodetik lebih cepat.