Como posso grep os resultados de FIND usando -EXEC e ainda a saída para um arquivo?

54

Melhor explicar nos exemplos.

Eu posso:

find . -name "*.py" -type f > output.txt

Mas como posso armazenar a saída no mesmo arquivo para:

find . -name "*.py" -type f -exec grep "something" {} \

Eu não posso simplesmente fazer

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt
    
por bakytn 19.09.2011 / 19:22

4 respostas

91

Se eu entendi corretamente, é isso que você quer fazer:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Find todos os arquivos com extensão py , grep apenas linhas que contêm something e salvam as linhas em output.txt . Se o arquivo contiver alguma coisa, ele será substituído.

Editar: Usando -exec:

find . -name '*.py' -exec grep 'something' {} \; > output.txt

Estou incorporando o comentário de Chris Downs aqui. O comando acima resultará em grep sendo executado tantas vezes quanto find encontra ocorrências. No entanto, se você substituir o ; por um + , grep será chamado com a saída de find concatenada (até um determinado limite). Veja pergunta Usando ponto e vírgula (;) vs mais (+) com exec in find para mais sobre o assunto.

    
por 19.09.2011 / 19:28
18

Se você quiser salvar todas as linhas correspondentes em todos os arquivos em output.txt , seu último comando funcionará, exceto que você está perdendo o ; exigido no final do comando.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

Se você quiser que cada execução de grep produza a saída para um arquivo diferente, execute um shell para calcular o nome do arquivo de saída e executar o redirecionamento.

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;
    
por 20.09.2011 / 01:48
4

Para o registro, grep tem --include e --exclude argumentos que você pode usar para filtrar os arquivos pesquisados:

grep -r --include="*.py" "something" > output.txt
    
por 01.11.2016 / 21:31
2

Use tee :

find . -name '*.py' | tee output.txt | xargs grep 'something'

A ressalva é se você tiver arquivos com caracteres especiais (incluindo espaços) com os quais xargs e grep não funcionarão bem ( a file.txt será interpretado como dois arquivos, a e file.txt ). A alternativa para isso é usar o -x ou -print0 , mas qualquer um deles irá poluir seu output.txt . O -x usará \ para escapar de certos caracteres especiais e isso será em output.txt . O -print0 usará um byte nulo como um separador de campo (que também requer xargs -0 ) e output.txt parecerá uma linha de texto longa e contígua.

Como você lida (ou não) com isso é com você.

    
por 19.09.2011 / 19:43

Tags