Se eu entendi direito, é 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 output.txt
. Se o arquivo contiver algo, 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á na grep
execução quantas vezes forem find
encontradas as ocorrências. No entanto, se você substituir o ;
por a +
, grep
será chamado com a saída find
concatenada (até um determinado limite). Veja a pergunta Usando ponto-e-vírgula (;) vs mais (+) com exec para encontrar mais informações sobre o assunto.
+
vez de\;
, ele melhorará significativamente o tempo de execução (uma vez que contatenará os argumentos anteriores à execução atéARG_MAX
).grep -H
se você deseja incluir o nome do arquivo do arquivo na saída.Se você quiser salvar todas as linhas correspondentes em todos os arquivos
output.txt
, seu último comando funcionará, exceto que você está perdendo o necessário;
no final do comando.Se você deseja que cada execução
grep
produza saída para um arquivo diferente, execute um shell para calcular o nome do arquivo de saída e executar o redirecionamento.fonte
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
E se você gostaria de ver os números das linhas grep'ed, você pode, é claro, usargrep -n "something"
Para o registro,
grep
tem--include
e--exclude
argumentos que você pode usar para filtrar os arquivos pesquisados:fonte
grep
faz.Use
tee
:A ressalva, é se você tiver quaisquer arquivos com caracteres especiais (incluindo espaços), que
xargs
egrep
não vai funcionar bem com (a file.txt
será interpretada como dois arquivos,a
efile.txt
). A alternativa é usar o-x
ou-print0
, mas qualquer um deles poluirá o seuoutput.txt
. O-x
irá usar\
para escapar de certos caracteres especiais e isso será exibidooutput.txt
. Ele-print0
usará um byte nulo como separador de campos (que também requerxargs -0
) eoutput.txt
será semelhante a uma longa linha de texto contígua.Como você lida (ou não) com isso depende de você.
fonte