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脚本的文件匹配。