使用Python Shebang查找所有文件


9

我正在尝试对大型源代码树执行PEP8检查。该树由各种语言的文件混合而成。这个想法是检查所有Python脚本而不必显式列出它们。这些文件中的大多数实际上没有.py扩展名。有没有一种简单的方法可以在shebang中找到带有单词Python的所有文件,或者找到在执行时将与Python一起运行的所有文件?

Answers:


7

尝试这样做:

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

ack相同:

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

5
请注意,虽然grep -l一旦找到匹配项便会停止读取文件,但是对于不匹配的文件,它将读取整个文件。它还会在文件中间找到匹配项,例如,它可以与shar包含python脚本的文件匹配。
斯特凡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/awknextfile,则可以编写:

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

它仍将运行尽可能少awk的,但将完全读取文件。

避免完全读取文件的另一种选择是,它可以与每个文件一起使用awkfind但意味着awk每个文件运行一个文件,它是:

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

1
+1,但最后一个命令也匹配空文件。
l0b0

好点@ l0b0。更新。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.