Mar*_*ppi 10 search shell-script text-processing
我正在尝试针对大型源代码树运行 PEP8 检查。该树由各种语言的文件混合组成。这个想法是检查所有 Python 脚本,而不必明确列出它们。大多数这些文件实际上没有.py
扩展名。有没有一种简单的方法可以在 shebang 中找到所有带有 Python 一词的文件,或者找到所有在执行时会用 Python 运行的文件?
Sté*_*las 16
使用 GNU、FreeBSD、NetBSD 或 OpenBSD(以及其他可能的)awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Run Code Online (Sandbox Code Playgroud)
将只查看每个文件的第一行,并awk
根据需要运行尽可能少的s。
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}' {} +
Run Code Online (Sandbox Code Playgroud)
哪个仍然会运行尽可能少的awk
s 但会完全读取文件。
另一种方法,以避免完全读取文件,并会与每一个工作awk
和find
,而且意味着运行一个awk
每个文件将是:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
Run Code Online (Sandbox Code Playgroud)
尝试这样做:
grep -rl '^#!/.*python' .
Run Code Online (Sandbox Code Playgroud)
与ack相同:
ack -rl '^#!/.*python' .
Run Code Online (Sandbox Code Playgroud)