Answers:
使用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的,但将完全读取文件。
避免完全读取文件的另一种选择是,它可以与每个文件一起使用awk,find但意味着awk每个文件运行一个文件,它是:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l一旦找到匹配项便会停止读取文件,但是对于不匹配的文件,它将读取整个文件。它还会在文件中间找到匹配项,例如,它可以与shar包含python脚本的文件匹配。