find . -name '*.py' -exec grep something {} \; -print
imprimiria o nome do arquivo após as linhas correspondentes.
find . -name '*.py' -exec grep something /dev/null {} +
imprime o nome do arquivo na frente de cada linha correspondente (adicionamos /dev/null
para o caso em que há apenas um arquivo correspondente, pois grep
não imprime o nome do arquivo se ele for passado apenas um arquivo para procurar. A implementação GNU de grep
tem uma opção -H
para isso como alternativa).
find . -name '*.py' -exec grep -l something {} +
imprime apenas os nomes dos arquivos que possuem pelo menos uma linha correspondente.
Para imprimir o nome do arquivo antes das linhas correspondentes, você pode usar o awk em vez disso:
find . -name '*.py' -exec awk '
FNR == 1 {filename_printed = 0}
/something/ {
if (!filename_printed) {
print FILENAME
filename_printed = 1
}
print
}' {} +
Ou chame grep
duas vezes para cada arquivo - embora isso seja menos eficiente, pois executaria pelo menos um comando grep
e até dois para cada arquivo (e leria o conteúdo do arquivo duas vezes): / p>
find . -name '*.py' -exec grep -l something {} \; \
-exec grep something {} \;
Em qualquer caso, você não deseja passar o resultado de find
como e Lembre-se de citar suas variáveis .
Se você quiser usar um loop de shell, com ferramentas GNU:
find . -name '*.py' -exec grep -l --null something {} + |
xargs -r0 sh -c '
for file do
printf "%s\n" "$file"
grep something < "$file"
done' sh
(também funciona no FreeBSD e derivados).