bash find xargs grep hanya kejadian tunggal


16

Mungkin agak aneh - dan mungkin ada alat lain untuk melakukan ini tetapi, yah ..

Saya menggunakan perintah bash klasik berikut untuk menemukan semua file yang berisi beberapa string:

find . -type f | xargs grep "something"

Saya memiliki sejumlah besar file, pada berbagai kedalaman. kemunculan pertama "sesuatu" sudah cukup bagi saya, tetapi menemukan terus mencari, dan membutuhkan waktu lama untuk menyelesaikan sisa file. Yang ingin saya lakukan adalah sesuatu seperti "umpan balik" dari grep back untuk menemukan sehingga menemukan bisa berhenti mencari lebih banyak file. Apakah hal seperti itu mungkin?

Jawaban:


20

Cukup simpan dalam ranah temukan:

find . -type f -exec grep "something" {} \; -quit

Begini Cara kerjanya:

Surat -execwasiat itu akan bekerja ketika itu -type fakan benar. Dan karena grepkembali 0(sukses / benar) ketika -exec grep "something"memiliki kecocokan, -quitakan dipicu.


8
find -type f | xargs grep e | head -1

tidak persis seperti itu: ketika headberakhir, elemen tengah pipa diberitahu dengan sinyal 'pipa rusak', berakhir pada gilirannya, dan memberitahukan find. Anda akan melihat pemberitahuan seperti

xargs: grep: terminated by signal 13

yang mengkonfirmasi ini.


+1 untuk penjelasan dan alternatifnya, meskipun jawaban lain tampaknya lebih elegan bagi saya, karena lebih mandiri
hello_earth

8

Untuk melakukan ini tanpa mengubah alat: (Saya suka xargs)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1 tidak pernah tahu xargs akan memiliki kemampuan multitugas seperti itu - terima kasih atas komentar lain juga! :)
hello_earth
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.