使用 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根据需要运行尽可能少的 s 。

上面的声明nextfile不是标准的,但在一些实现中可以找到,包括 GNU 实现(这可能是它的起源)。

虽然上面的代码似乎也适用于其他实现,但该nextfile语句不会执行任何操作(将被识别为包含未设置nextfile变量的表达式),因此这意味着所有文件都将被完全读取,并且文件名将为每个匹配行打印。

如果您awk支持FNR(就像 POSIX awks 一样,但不是原始的awk,所以在 Solaris 上/usr/xpg4/bin/awk而不是/usr/bin/awk)和 not nextfile,您可以编写它:

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

它仍然会运行awk尽可能少的时间,但会完全读取文件。

避免完全读取文件并且适用于每个文件的另一种选择是,但意味着每个文件awk运行find一个:awk

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

答案2

尝试这样做:

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

同样的事情与确认

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

相关内容