bash encontra xargs grep única ocorrência única

15

Talvez seja um pouco estranho - e talvez haja outras ferramentas para fazer isso, mas, bem ...

Estou usando o seguinte comando bash clássico para encontrar todos os arquivos que contenham alguma string:

find . -type f | xargs grep "something"

Eu tenho um grande número de arquivos, em várias profundidades. primeira ocorrência de "alguma coisa" é suficiente para mim, mas acho que continua pesquisando, e leva muito tempo para completar o resto dos arquivos. O que eu gostaria de fazer é algo como um "feedback" do grep de volta para encontrar, para que o find pare de procurar por mais arquivos. Isso é possível?

    
por hello_earth 25.05.2010 / 13:46

3 respostas

19

Simplesmente mantenha-o no domínio da descoberta:

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

Funciona assim:

O -exec funcionará quando o -type f for verdadeiro. E como grep retorna 0 (success / true) quando o -exec grep "something" tem uma correspondência, o -quit será acionado.

    
por 25.05.2010 / 14:02
8
find -type f | xargs grep e | head -1

faz exatamente isso: quando o head termina, o elemento do meio do canal é notificado com um sinal de 'canal quebrado', termina por sua vez e notifica o find . Você deve ver um aviso como

xargs: grep: terminated by signal 13

que confirma isso.

    
por 25.05.2010 / 14:05
6

Para fazer isso sem alterar as ferramentas: (eu amo 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
    
por 11.12.2013 / 23:13