大規模なソースツリーで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
)。これは、すべてのファイルを完全に読み取り、ファイル名が一致する各エントリを印刷することを意味します。ライン。
awk
awksをサポートしFNR
(POSIXと同じですが、ネイティブはサポートせず、awk
Solarisでは代わりに/usr/xpg4/bin/awk
)/usr/bin/awk
awksをサポートしない場合は、nextfile
次のように書くことができます。
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
awk
できるだけ短時間で実行されますが、ファイルを完全に読み取ってください。
ファイルを完全に読み取らずにすべてのファイルに対して機能しますが、ファイルごとに1つずつawk
実行する別のオプションは次のとおりです。find
awk
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print