回答:
GNU、またはFreeBSDまたはNetBSDまたはOpenBSD(および場合によってはその他)の場合awk:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
各ファイルの最初の行だけを見てawk、必要なだけ実行します。
上記のnextfileステートメントは標準ではありませんが、GNUの実装を含むいくつかの実装に含まれています(おそらく、その実装元です)。
上記のコードは他の実装でも機能するように見えますが、nextfileステートメントはそこで何もしません(未設定のnextfile変数で構成される式として認識されます)。つまり、すべてのファイルが完全に読み取られ、ファイル名が一致する行ごとに印刷されます。
あなたの場合はawkサポートFNR(POSIXのawksは、元を行いますがないようawkなので、Solaris上/usr/xpg4/bin/awkではなく/usr/bin/awk)ではなくnextfile、あなたはそれを書くことができます。
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
それでもawk可能な限り数秒は実行されますが、ファイルを完全に読み取ります。
別の方法としては、完全にファイルを読み込む避けるために、それは、すべてで動作するだろうawkとfindが、1つの実行中を意味しますawkファイルごとに次のようになります。
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -lにはマッチしないとファイルのために、一致するものを見つけるとすぐにファイルの読み取りを停止だろう、それはファイル全体を読んでいました。また、ファイルの途中で一致を見つけるため、たとえば、sharpythonスクリプトを含むファイルで一致する可能性があります。