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

Estou usando o seguinte comando bash clássico para localizar todos os arquivos que contêm alguma string:

find . -type f | xargs grep "something" 

Tenho um grande número de arquivos, em várias profundidades . a primeira ocorrência de “algo” é suficiente para mim, mas find continua pesquisando e leva muito tempo para completar o resto dos arquivos. O que eu gostaria de fazer é algo como um “feedback” de grep para encontrar para que find poderia parar de pesquisar por mais arquivos. Isso é possível?

Resposta

Basta mantê-lo dentro do domínio de encontrar:

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

É assim que funciona:

O -exec funcionará quando -type f será verdadeiro. E porque grep retorna 0 (sucesso / verdadeiro) quando tiver uma correspondência, a -quit será acionada.

Resposta

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

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

xargs: grep: terminated by signal 13 

que confirma isso.

Comentários

  • +1 para a explicação e a alternativa, embora a outra resposta pareça mais elegante para mim, já que é mais autossuficiente

Resposta

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 

Comentários

  • +1 nunca soube que o xargs teria tais capacidades multitarefa – obrigado por outros comentários também! 🙂

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *