Как я могу считать весь Python и сценарии оболочки в моей целой системе?

Как я могу считать весь Python и сценарии оболочки в моей целой системе?

0
задан 21 November 2019 в 20:59

2 ответа

В отсутствие более определенной цели это будет приблизительно, неважно, как Вы делаете это из-за неоднозначностей о том, что составляет сценарий оболочки и что составляет сценарий 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 управляйте как корень с 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 не быть one-per-line. Это обычно важно, и часто даже жизненно важно, для составления таких вещей, и это может быть сделано. В этом случае, однако, Вы просто идете для оценки (из-за нечеткой природы самой проблемы), и кажется, что Вы не переименовываете, изменение, удаление, или даже создание чего-либо базировалось непосредственно на результате, таким образом, я не думаю, что стоит волноваться об этом. Если Вы заканчиваете тем, что выполнили итерации на этом и определили проблему более строго, то могло стоить обратиться к этому.

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

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


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

Например, для нахождения всех сценариев оболочки в текущем каталоге:

find . -type f -executable -exec file {} + | grep -Fi 'shell script,'
1
ответ дан 21 December 2019 в 23:52

Быстрый обзор

Вот инструкция по тому, как сделать это.

$ 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

Полоса все файлы, которые не говорят "Сценарий оболочки Границы снова", или "сценарий Python". Добавьте к списку сценарии оболочки POSIX:

$ 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 центральных процессоров (в моем случае) сразу:

find xargs 8 cores.gif

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

1
ответ дан 21 December 2019 в 23:52

Другие вопросы по тегам:

Похожие вопросы: