Encontre todos os arquivos com um Python Shebang

9

Estou tentando executar uma verificação PEP8 em uma grande árvore de origem. A árvore é composta de uma mistura de arquivos em vários idiomas. A idéia é verificar todos os scripts Python sem precisar listá-los explicitamente. A maioria desses arquivos na verdade não possui uma extensão .py . Existe uma maneira simples de encontrar todos os arquivos com a palavra Python no shebang ou encontrar todos os arquivos que seriam executados com Python quando executados?

    
por Marco Ceppi 25.02.2013 / 22:17

2 respostas

6

Tente fazer isso:

grep -rl '^#!/.*python' .

Mesma coisa com ack :

ack -rl '^#!/.*python' .
    
por 25.02.2013 / 22:21
12

Com o GNU, ou FreeBSD ou NetBSD ou OpenBSD (e potencialmente outros) awk :

find . -type f -exec awk '
  /^#!.*python/{print FILENAME}
  {nextfile}' {} +

Examinaria apenas a primeira linha de cada arquivo e executaria o mínimo de awk s, conforme necessário.

A declaração nextfile acima não é padrão, mas é encontrada em algumas implementações, incluindo a da GNU (que provavelmente é de onde ela se originou).

Embora o código acima pareça funcionar em outras implementações também, a instrução nextfile não faria nada lá (seria reconhecida como uma expressão que consiste em uma variável nextfile não definida), então isso significaria os arquivos seriam lidos completamente e o nome do arquivo seria impresso para cada linha correspondente.

Se o awk suportar FNR (como acontece com os POSIX aws mas não o original awk , portanto, 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 qual ainda executaria o mínimo de awk s possível, mas leria os arquivos totalmente.

Outra alternativa para evitar a leitura completa dos arquivos e que funcionaria com todos os awk e find , mas significaria executar um awk por arquivo seria:

find . -type f -exec awk '
  /^#!.*python/{r=1};{exit}
  END {exit(1-r)}' {} \; -print
    
por 25.02.2013 / 22:34