Jawaban lain ini agak cacat. Perintahnya adalah
find . -name '*.txt' | head -n 3
Lalu ada penjelasan di salah satu komentar [penekanan milik saya]:
head
memulai dan menunggu input dari sisi kiri pipa. Kemudian find
mulai dan mencari file yang sesuai dengan kriteria yang ditentukan, mengirimkan hasilnya melalui pipa. Ketika head
telah menerima dan mencetak jumlah garis yang diminta, itu berakhir, menutup pipa. find
pemberitahuan pipa tertutup dan juga berakhir. Sederhana, elegan, dan efisien .
Ini adalah hampir benar.
Masalahnya adalah find
pemberitahuan 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 head
keluar, shell segera melanjutkan. find
Proses latar belakang dapat diabaikan kemudian (itu akan keluar cepat atau lambat) atau ditargetkan dengan pkill
atau sesuatu.
Untuk membuktikan konsep Anda dapat mencari /
. Kami mengharapkan satu pertandingan saja, namun find
mencarinya 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 -quit
hanya menampilkan pertandingan pertama dan membiarkanfind
keluar setelah pertandingan pertama. Saya tidak tahu apakah mungkin untuk beradaptasi dengan kasus "keluar setelah menemukan n cocok".