Jawaban lain ini agak cacat. Perintahnya adalah
find . -name '*.txt' | head -n 3
Lalu ada penjelasan di salah satu komentar [penekanan milik saya]:
headmemulai dan menunggu input dari sisi kiri pipa. Kemudian findmulai dan mencari file yang sesuai dengan kriteria yang ditentukan, mengirimkan hasilnya melalui pipa. Ketika headtelah menerima dan mencetak jumlah garis yang diminta, itu berakhir, menutup pipa. findpemberitahuan pipa tertutup dan juga berakhir. Sederhana, elegan, dan efisien .
Ini adalah hampir benar.
Masalahnya adalah findpemberitahuan pipa tertutup hanya ketika mencoba menulis ke dalamnya - dalam hal ini ketika pertandingan ke-4 ditemukan. Tetapi jika tidak ada pertandingan ke-4 makafind akan dilanjutkan. Shell Anda akan menunggu! Jika itu terjadi dalam skrip, skrip akan menunggu, meskipun faktanya kita sudah tahu output pipa sudah final dan tidak ada yang dapat ditambahkan ke dalamnya. Tidak begitu efisien.
Efeknya dapat diabaikan jika ini khusus find selesai dengan cepat dengan sendirinya tetapi dengan pencarian kompleks di pohon file besar perintah mungkin tidak perlu menunda apa pun yang ingin Anda lakukan selanjutnya.
Solusi yang tidak terlalu sempurna adalah berjalan
( find … & ) | head -n 3
Dengan cara ini ketika headkeluar, shell segera melanjutkan. findProses latar belakang dapat diabaikan kemudian (itu akan keluar cepat atau lambat) atau ditargetkan dengan pkillatau sesuatu.
Untuk membuktikan konsep Anda dapat mencari /. Kami mengharapkan satu pertandingan saja, namun findmencarinya di mana-mana dan mungkin membutuhkan banyak waktu.
find / -wholename / 2>/dev/null | head -n 1
Hentikan dengan Ctrl+ Csegera setelah Anda melihat masalah. Sekarang bandingkan:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
find . -name '*.txt' -print -quithanya menampilkan pertandingan pertama dan membiarkanfindkeluar setelah pertandingan pertama. Saya tidak tahu apakah mungkin untuk beradaptasi dengan kasus "keluar setelah menemukan n cocok".