Trouver tous les files avec un Shebang Python

J'essaie d'exécuter un contrôle PEP8 contre un tree source de grande taille. L'tree est composé d'un mélange de files dans différentes langues. L'idée est de vérifier tous les scripts Python sans avoir à les listr explicitement. La majorité de ces files n'ont pas d'extension .py . Existe-t-il un moyen simple de find tous les files avec le mot Python dans le shebang ou de find tous les files qui seraient exécutés avec Python lorsqu'il est exécuté?

    Essayez de faire ceci:

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

    Même chose avec ack :

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

    Avec GNU, ou FreeBSD ou NetBSD ou OpenBSD (et potentiellement d'autres) awk :

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

    Ne regarderait que la première ligne de chaque file et fonctionnerait aussi peu que possible.

    L'instruction nextfile ci-dessus n'est pas standard mais se retrouve dans quelques implémentations dont celle de GNU (qui est probablement d'où elle provient).

    Bien que le code ci-dessus semble fonctionner également dans d'autres implémentations, l'instruction nextfile ne ferait rien là-bas (serait reconnue comme une expression consistant en une variable nextfile non nextfile ), ce qui signifierait que tous les files seraient lus complètement et que nom de file serait imprimé pour chaque ligne correspondante.

    Si votre awk supporte le FNR (comme les awks POSIX, mais pas l' awk origine, donc sur Solaris /usr/xpg4/bin/awk et non /usr/bin/awk ) et non nextfile , vous pouvez l'écrire:

     find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} + 

    Ce qui fonctionnerait toujours aussi peu que possible, mais lirait complètement les files.

    Une autre alternative pour éviter de lire les files entièrement et qui fonctionnerait avec chaque awk et find mais signifierait courir un awk par dossier serait:

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