Com o GNU, ou FreeBSD ou NetBSD ou OpenBSD (e potencialmente outros) awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Observaria apenas a primeira linha de cada arquivo e executaria o número de awk
segundos que fosse necessário.
A nextfile
declaração acima não é padrão, mas é encontrada em algumas implementações, incluindo a GNU (que provavelmente é de onde se originou).
Embora o código acima pareça funcionar em outras implementações também, a nextfile
instrução não faria nada lá (seria reconhecida como uma expressão que consiste em uma nextfile
variável não definida ), o que significa que todos os arquivos seriam lidos completamente e o nome do arquivo ser impresso para cada linha correspondente.
Se os seus awk
suportes FNR
(como os POSIX awks, mas não o original awk
, assim como no Solaris /usr/xpg4/bin/awk
e não /usr/bin/awk
) e não nextfile
, você pode escrevê-lo:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
O que ainda executaria o mínimo de awk
s possível, mas leria os arquivos completamente.
Outra alternativa para evitar a leitura completa dos arquivos e que funcionaria com todos awk
e, find
porém, significaria executar um awk
por arquivo:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
pare de ler um arquivo assim que encontrar uma correspondência, para arquivos sem correspondência, ele lerá o arquivo inteiro. Ele também encontraria correspondências no meio dos arquivos; portanto, poderia corresponder a umshar
arquivo que contém scripts python.