我正在尝试对大型源树运行 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