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
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, usargrep -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"`"
+
em vez de\;
, melhorará o tempo de execução significativamente (uma vez que contatenate argumentos antes da execução atéARG_MAX
).grep -H
se quiser incluir o nome do arquivo na saída.LC_ALL=C
logo antes dexargs
para obter muito de velocidade extra. E você pode usar um sinalizador-P6
emxargs
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/…+
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.