Hanya temukan beberapa file pertama yang cocok menggunakan find?

17

Katakanlah mungkin ada ratusan *.txtfile dalam direktori. Saya hanya ingin menemukan tiga *.txtfile pertama dan kemudian keluar dari proses pencarian.

Bagaimana cara mencapai ini menggunakan findutilitas? Saya sudah membaca halaman manualnya dengan cepat, sepertinya bukan pilihan seperti ini.

mitnk
sumber
3
Anda dapat menggunakan find . -name '*.txt' -print -quithanya menampilkan pertandingan pertama dan membiarkan findkeluar setelah pertandingan pertama. Saya tidak tahu apakah mungkin untuk beradaptasi dengan kasus "keluar setelah menemukan n cocok".
NN

Jawaban:

22

Anda dapat menyalurkan output findmelalui head:

find . -name '*.txt' | head -n 3
Chris Card
sumber
2
Saya tahu ini, saya ingin keluar dari proses pencarian setelah menemukan tiga file yang cocok pertama. Mungkin ada banyak file yang cocok saya tidak peduli.
mitnk
2
Saya pikir perintah find tidak dihentikan setelah head telah mencetak 3 file pertama
Chris Card
1
Ya, ini aneh, tetapi Anda benar.
mitnk
19
Sama sekali tidak aneh - ini adalah cara kerja pipa di UNIX. 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.
D_Bye
3
Untuk meringkas, -n 3apakah POSIX kompatibel , dan karena itu cenderung lebih portabel.
l0b0
4

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
Kamil Maciorowski
sumber