Jawaban:
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.
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
findsepertinya tidak tergantung pada kode keluar dari apa pun -execitu berlari.
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).
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 -printnama 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 -quitmenghapusnya, 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 0diteruskan ke finddan membagi variabel keluar pada nol, atau Anda bisa menambahkan pernyataan cetak untuk itu.
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.
*padaegrepregex sepenuhnya mubazir. Karena Anda tidak menggunakanegrepsintaks ekspresi reguler, plain oldgrepmungkin beberapa mikrodetik lebih cepat.