С 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.