Как мне подсчитать все скрипты Python и Shell во всей моей системе?

Как мне подсчитать все скрипты Python и Shell во всей моей системе?

Как мне подсчитать все скрипты Python и Shell во всей моей системе?

решение1

При отсутствии более конкретной цели это будет приблизительным, как бы вы это ни делали, из-за неопределенностей относительно того, что составляет скрипт оболочки, а что составляет скрипт Python. Это не делает проблему слишком плохо определенной,пока вам нужно приближение. И вы можете получить хорошее приближение.

Учитывая это, я предлагаю следующую команду для вывода списка скриптов оболочки и Python:

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,'

Если вывод выглядит приемлемым для ваших нужд, вы можете запустить его еще раз, изменив его для подсчета количества результатов:

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,' | wc -l

Вы можете получить несколько ошибок "Отказано в доступе". Это нормально. Я не рекомендую пытаться подавлять эти сообщения об ошибках, потому что вы должны прочитать или, по крайней мере, просмотреть их, чтобы увидеть, похоже ли, что вы не смогли получить доступ к каким-либо файлам или расположениям, которые вас интересовали. Вы можете запустить команду findкак root, sudoесли вы действительно этого хотите.

  • -type fзаставляет его находить только обычные файлы. Обычно лучше использовать -xtype fдля включения символических ссылок, которые разрешаются в обычные файлы, но в этом случае это приведет к пересчету.
  • -executableзаставляет его находить только те файлы, которые являются исполняемыми пользователем, который запускает find. Просмотр неисполняемых файлов, чтобы увидеть, являются ли они скриптами оболочки или Python, значительно увеличит время выполнения команды. Вы также можете получить больше ложных срабатываний таким образом, поскольку файлы, которые не являются исполняемыми, могут быть «библиотеками», а не скриптами, т. е. они могут состоять из команд оболочки и быть предназначены для загрузки с помощью .или sourceв скрипты оболочки, или они могут быть модулями Python, которые можно импортировать с помощью importили fromв программы Python. (Вы можете подумать, что этого не произойдет, поскольку такие файлы, как правило, не имеютпритон, но findищет нечто большее, чем просто притон.) Однако вы можете пропустить, -executableесли хотите, иесли вы готовы подождатьпоскольку ваша команда пытается открыть и прочитать начало каждого обычного файла в вашей системе.
  • -exec ... +запускает команду ...с найденными файлами в качестве аргументов командной строки. Она запускает команду столько раз, сколько необходимо для обработки всех файлов. Часто это происходит только один раз; для всех исполняемых файлов во всей вашей системе это, скорее всего, будет сделано больше одного раза, но гораздо меньше раз, чем если бы вы запускали ее один раз для каждого файла (как это и -exec ... \;было бы). Даже для того же количества файлов запуск команды меньшее количество раз, как правило, оказывается заметно быстрее, чем запуск ее большее количество раз, поскольку это снижает связанные с этим накладные расходы.
  • Команда fileсмотрит на начало файла и угадывает, обычно довольно точно, какой это тип файла. Она выводит данные в двухколоночном формате, с путем или именем файла слева и резюме того, чтодобрыйфайла он, по-видимому, находится справа.
  • Команда grepфильтрует входные данные и выводит только те строки, которые без учета регистра ( -i) соответствуютрасширенное регулярное выражение( -E) (python|shell) script,. Это строки, содержащие текст python script,, shell script,, или любой его вариант. Файлы, findидентифицируемые как типы скриптов, покажут это.
  • wc -l, который появляется во второй из двух команд, показанных выше, подсчитывает строки.

Как показано, этот метод совершенно непригоден длямногозадачи, требующие различения типов имеющихся файлов.Причина в том, что файл может содержать python script,в своем имени текст, например, , а также символы новой строки в своем имени, из-за чего выводимые данные fileне будут выводиться по одному символу на строку.Обычно важно, а часто даже жизненно необходимо, учитывать такие вещи, и это можно сделать.В этом случае, однако, вы просто идете к оценке (из-за нечеткой природы самой проблемы) и, похоже, вы не переименовываете, не изменяете, не удаляете и даже не создаете ничего, основываясь непосредственно на результате, так что я не думаю, что стоит беспокоиться об этом. Если вы в конечном итоге будете итерировать это и определять проблему более строго, то, возможно, стоит заняться этим.

Обратите внимание, что есть один важный случай, когда вы можете захотеть считать неисполняемые файлы скриптами: если у вас есть много скриптов Python, перенесенных из такой системы, как Windows, где они не помечены как исполняемые. В этом случае вы можете искать .pyфайлы, хотя и имейте в виду, что многие из них, скорее всего, будут модулями Python, а не скриптами Python. Если была соблюдена хорошая практика Python помещать хэшбэнг в начало скрипта (это полезно даже в Windows, потому что py.exeи pyw.exeраспознает их, хотя, к сожалению, это не всегда делается), то метод, который ищет только хэшбэнги, но игнорирует, является ли файл исполняемым, может больше подойти для ваших нужд.

Также есть небольшой, но важный случай, когда вы можете захотеть считать неисполняемые файлы скриптами любого рода — или, точнее, когда вы можете захотеть проверить исполняемость по-другому. Если у вас смонтирован диск noexec, то ни один файл на нем не пройдет findтест -executable. Обратите внимание, что это другая проблема, нежели запуск findот имени пользователя, у которого нет прав на выполнение некоторых файлов — как и проблема запуска от имени пользователя, у которого нет прав на просмотр некоторых каталогов, ее можно решить, запустив его от имени достаточно привилегированного пользователя.


Эта проблема,как вы это изложили, необычно--обычно требуется найти письменности определенного языка или небольшой семьи близкородственных языков. Но для удобства будущих читателей, обратите внимание, что найти все (например) скрипты оболочки в одном, возможно, большом, каталоге можно также с помощью небольшой модификации приведенных выше команд. (То же самое относится и к методике, представленной вОтвет WinEunuuchs2Unix--это тоже полезно.)

Например, чтобы найти все скрипты оболочки в текущем каталоге:

find . -type f -executable -exec file {} + | grep -Fi 'shell script,'

решение2

Краткая информация

Вот руководство о том, как это сделать.

$ for f in * ; do file "$f" ; done

aptfielout: ASCII text, with very long lines
aptfilein: ASCII text, with very long lines
aptfileout: ASCII text
aptfileparse.sh: Bourne-Again shell script, ASCII text executable, with very long lines
aptfileparse.sh~: ASCII text, with very long lines
calc.py: Python script, UTF-8 Unicode text executable
catall.sh: Bourne-Again shell script, ASCII text executable

Удалите все файлы, в которых не указано "Bourne-Again shell script" или "Python script". Добавьте в список POSIX shell scripts:

$ file /bin/zgrep
/bin/zgrep: POSIX shell script, ASCII text executable

Полный ответ

/$ time find * -type f -print0 2>/dev/null | xargs -0 -P 8 file | \
sed 's/.*: //g' | sed 's/^ *//g' | \
grep -Eio 'shell script,|Python script,' | sort | uniq -c  

  19151 Python script,                  
    127 python script,
  18420 shell script,

real    16m14.939s
user    54m7.355s
sys     2m33.238s

Начиная с корня ( /), findвсе файлы и конвейер передаются xargsкоманде как имена, завершающиеся нулевым байтом.

Команда xargsвыполняется параллельно, максимизируя все 8 процессоров для более быстрой обработки. Каждый параллельный процесс вызывает команду file, которая получает описание файла, как показано в предыдущем разделе.

Команда grepвыбирает скрипты оболочки и скрипты Python.

Команда sortсортирует скрипты оболочки и скрипты Python.

Команда uniqподсчитывает количество вхождений каждой группы.


забавные факты

Вы можете действительно нагрузить свою систему, запустив все 8 процессоров (в моем случае) одновременно:

найти xargs 8 cores.gif

Красота Linux проявляется, потому что другие задачи, такие как создание записи экрана .gifи видео, запущенное на третьем мониторе (телевизор с большим экраном), продолжают нормально функционировать. Linux не позволяет xargs fileкоманде затормозить работу системы.

Связанный контент