bash encuentra xargs grep solo ocurrencia única

bash encuentra xargs grep solo ocurrencia única

Tal vez sea un poco extraño, y tal vez haya otras herramientas para hacer esto, pero, bueno...

Estoy usando el siguiente comando bash clásico para buscar todos los archivos que contienen alguna cadena:

find . -type f | xargs grep "something"

Tengo una gran cantidad de archivos, en múltiples profundidades. La primera aparición de "algo" es suficiente para mí, pero buscar continúa buscando y lleva mucho tiempo completar el resto de los archivos. Lo que me gustaría hacer es algo así como una "comentarios" de grep a find para que find pueda dejar de buscar más archivos. ¿Es posible tal cosa?

Respuesta1

Simplemente manténgalo dentro del ámbito de búsqueda:

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

Así es como funciona:

La -execvoluntad funcionará cuando -type fsea cierta. Y debido a que grepregresa 0(éxito/verdadero) cuando -exec grep "something"tiene una coincidencia, -quitse activará.

Respuesta2

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

hace exactamente eso: cuando headtermina, el elemento central de la tubería recibe una notificación con una señal de "tubería rota", termina a su vez y notifica al find. Deberías ver un aviso como

xargs: grep: terminated by signal 13

lo que lo confirma.

Respuesta3

Para hacer esto sin cambiar de herramientas: (me encantan los 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

información relacionada