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?

hello_earth
sumber

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.

Chen Levy
sumber
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.

Kilian Foth
sumber
+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
bukzor
sumber
1
+1 tidak pernah tahu xargs akan memiliki kemampuan multitugas seperti itu - terima kasih atas komentar lain juga! :)
hello_earth