Melhor explicar com 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" {} \ 

Não consigo simplesmente fazer

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

Resposta

Se bem entendi, é isso que você quer fazer:

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

Encontre todos os arquivos com extensão .py, grep somente linhas que contenham something e salve as linhas em output.txt. Se o arquivo output.txt existir, ele será truncado, caso contrário, será criado.

Usando -exec:

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

Estou incorporando Chris Downs comente aqui: O comando acima resultará em grep sendo executado tantas vezes quanto find encontre nomes de caminho que passam nos testes fornecidos (apenas o único teste acima). No entanto, se você substituir o \; por um +, grep é chamado com vários nomes de caminho de find (até um certo limite).

Veja a pergunta Usando ponto e vírgula (;) vs mais ( +) com exec em find para mais sobre o assunto.

Comentários

  • Use + em vez de \;, melhorará o tempo de execução significativamente (uma vez que contatenate argumentos antes da execução até ARG_MAX).
  • Agora eu entendo o poder do xargs! Obrigado!
  • Use grep -H se quiser incluir o nome do arquivo na saída.
  • Use a opção 1. E adicione LC_ALL=C logo antes de xargs para obter muito de velocidade extra. E você pode usar um sinalizador -P6 em xargs para executar em paralelo com (neste caso) 6 processos (sinta-se à vontade para alterar o número de 6 para algo acima ou abaixo, para ver o que ' é mais rápido em sua máquina e em sua pesquisa). Referência: unix.stackexchange.com/questions/131535/…
  • Usando + em vez de \; passará vários arquivos para grep e se algum arquivo nesse conjunto contiver o texto ' algo ', todos esses arquivos passarão no teste. Portanto, não ' fará o que você deseja.

Resposta

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

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

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

find . -name "*.py" -type f -exec sh -c "grep "something" <"$0" >"$0.txt"" {} \; 

Comentários

  • o último muito bom: D
  • Expandir a resposta de @gilles para torná-la um pouco mais informativa, especialmente se a lista de arquivos que você ' ao lidar com é grande, você pode relatar o nome do arquivo (caminho relativo) de cada arquivo junto com os resultados grep ' ed usando este: find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt E se você ' quiser ver e os números de linha das linhas grep ' ed que você pode, é claro, usar grep -n "something"

Resposta

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

grep -r --include="*.py" "something" > output.txt 

Comentários

  • Pelo menos GNU grep o faz.

Resposta

Use tee:

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

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

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

Resposta

grep -n CThread "`find . -name "*.cpp"`" 

Deixe uma resposta

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