Python Shebangを使用してすべてのファイルを検索する

Python Shebangを使用してすべてのファイルを検索する

大規模なソースツリーでPEP8チェックを実行しようとしています。ツリーは、さまざまな言語のファイルが混在して構成されています。アイデアは、明示的にリストすることなく、すべてのPythonスクリプトをチェックすることです。これらのファイルのほとんどは実際には拡張子がありません.py。 ShebangでPythonという単語を含むすべてのファイルを検索するか、実行時にPythonで実行されるすべてのファイルを見つける簡単な方法はありますか?

答え1

GNU、FreeBSD、NetBSD、またはOpenBSD(およびその他)の使用awk

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

各ファイルの最初の行だけを見て、awk必要なだけ実行します。

上記の宣言はnextfile標準ではありませんが、GNU実装(元の場合もあります)を含むいくつかの実装で見つけることができます。

上記のコードは他の実装でも機能しているようですが、このnextfileステートメントは何もしません(未設定の変数を含む式として認識されますnextfile)。これは、すべてのファイルを完全に読み取り、ファイル名が一致する各エントリを印刷することを意味します。ライン。

awkawksをサポートしFNR(POSIXと同じですが、ネイティブはサポートせず、awkSolarisでは代わりに/usr/xpg4/bin/awk/usr/bin/awkawksをサポートしない場合は、nextfile次のように書くことができます。

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

awkできるだけ短時間で実行されますが、ファイルを完全に読み取ってください。

ファイルを完全に読み取らずにすべてのファイルに対して機能しますが、ファイルごとに1つずつawk実行する別のオプションは次のとおりです。findawk

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

答え2

この試み:

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

同じもの確認する:

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

関連情報