Python Shebangですべてのファイルを検索する


9

大きなソースツリーに対してPEP8チェックを実行しようとしています。ツリーは、さまざまな言語のファイルの組み合わせで構成されています。アイデアは、明示的にリストする必要なしにすべてのPythonスクリプトをチェックすることです。これらのファイルの大部分には、実際には.py拡張子がありません。シバンでPythonという単語を含むすべてのファイルを検索する、または実行時にPythonで実行されるすべてのファイルを検索する簡単な方法はありますか?

回答:


7

これを試してください:

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

ackと同じこと:

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

5
一方、そのノートgrep -lにはマッチしないとファイルのために、一致するものを見つけるとすぐにファイルの読み取りを停止だろう、それはファイル全体を読んでいました。また、ファイルの途中で一致を見つけるため、たとえば、sharpythonスクリプトを含むファイルで一致する可能性があります。
ステファンChazelas

14

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可能な限り数秒は実行されますが、ファイルを完全に読み取ります。

別の方法としては、完全にファイルを読み込む避けるために、それは、すべてで動作するだろうawkfindが、1つの実行中を意味しますawkファイルごとに次のようになります。

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

1
+1ですが、最後のコマンドは空のファイルにも一致します。
l0b0 2013

良い点@ l0b0。更新しました。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.