Apakah ada cara untuk memaksa find
perintah untuk berhenti tepat setelah menemukan kecocokan pertama?
Jawaban yang Diterima:
Dengan GNU atau FreeBSD find
, Anda dapat menggunakan -quit
predikat:
find . ... -print -quit
NetBSD find
setara:
find . ... -print -exit
Jika yang Anda lakukan hanyalah mencetak nama, dan dengan asumsi nama file tidak mengandung karakter baris baru, Anda dapat melakukan:
find . ... -print | head -n 1
Itu tidak akan menghentikan find
setelah pertandingan pertama, tetapi mungkin, tergantung pada waktu dan buffering pada pertandingan kedua atau (banyak) kemudian. Pada dasarnya, find
akan diakhiri dengan SIGPIPE ketika mencoba mengeluarkan sesuatu saat head
sudah hilang karena telah membaca dan menampilkan baris input pertama.
Perhatikan bahwa tidak semua shell akan menunggu find
perintah setelah head
telah kembali. Shell Bourne dan implementasi AT&T dari ksh
(bila non-interaktif) dan yash
(hanya jika pipa itu adalah perintah terakhir dalam skrip) tidak, membiarkannya berjalan di latar belakang. Jika Anda lebih suka melihat perilaku itu di shell apa pun, Anda selalu dapat mengubah yang di atas menjadi:
(find . ... -print &) | head -n 1
Jika Anda melakukan lebih dari sekadar mencetak jalur file yang ditemukan, Anda dapat mencoba pendekatan ini:
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(ganti printf
dengan apa pun yang akan Anda lakukan dengan file itu).
Itu memiliki efek samping find
mengembalikan status keluar yang mencerminkan fakta bahwa itu terbunuh.
Sebenarnya, menggunakan sinyal SIGPIPE sebagai ganti SIGTERM (kill -s PIPE
bukannya kill
) akan menyebabkan beberapa shell lebih diam tentang kematian itu (tetapi akan tetap mengembalikan status keluar bukan nol).