Intereting Posts
Ping IP работает, nslookup терпит неудачу. Новое ядро «Systemctl set-property user-1009.slice CPUQuota = 50%» – не удалось установить свойства объекта для user-1009.slice: модуль user-1009.slice не загружен Истинная перезагрузка tmux config? Проблемы с обновлением Yum на CentOS 6.5 минимальны, поскольку гостевая версия VMware Как вырезать строку на основе разделителя с пробелом setpci – Создание скрипта для изменения яркости вручную Просмотр процесса переднего плана с использованием ps Просить rsync удалять файлы на принимающей стороне, которых нет на стороне отправки, с исключениями на принимающей стороне Как настроить последние стабильные политики SELinux в Debian 8.7? Почему запрос будет перезаписан? mv-файлы в папки на основе нумерации в именах Как я могу распечатать все, кроме последних n символов в bash? Обработка вывода sqlite db в массив ksh с пробелами Проблема с жесткими локалями – регион управления гномом-центром падает с segfault Конечная точка IPSec отправляет ICMP «недоступный; фрагмент ", пока он не маршрутизируется

Найти все файлы с Python Shebang

Я пытаюсь запустить проверку PEP8 с большим деревом источников. Дерево состоит из сочетания файлов на разных языках. Идея состоит в том, чтобы проверить все сценарии Python, не указывая их явно. Большинство этих файлов на самом деле не имеют расширения .py . Есть ли простой способ найти все файлы со словом Python в shebang или найти все файлы, которые будут запускаться с Python при их исполнении?

Попробуйте сделать это:

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

То же самое с ack :

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

С GNU или FreeBSD или NetBSD или OpenBSD (и, возможно, другие) awk :

 find . -type f -exec awk ' /^#!.*python/{print FILENAME} {nextfile}' {} + 

Будет выглядеть только в первой строке каждого файла и будет работать как можно меньше awk .

nextfile не является стандартным, но находится в нескольких реализациях, включая GNU (что, вероятно, там, откуда оно было создано).

Хотя вышеприведенный код, похоже, работает и в других реализациях, оператор nextfile ничего не будет делать (будет распознан как выражение, состоящее из unset nextfile variable), так что это означает, что все файлы будут прочитаны полностью, а filename будет напечатано для каждой соответствующей строки.

Если ваш 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