Наконечник шляпы @ @ 1002 * gniourf_gniourf для выяснения фундаментального заблуждения.
Этот ответ пытается предоставить обзор существующих ответов и обсудить их тонкости и относительные достоинства , а также предоставить справочную информацию , особенно в отношении мобильности .
Поиск исполняемых файлов может ссылаться на два разных варианта использования :
- ориентированных на пользователя : найти файлы, которые исполняемые текущим пользователем .
- file-centric : найти файлы с (одним или несколькими) исполняемыми битами прав доступа set .
Обратите внимание, что в или может иметь смысл использовать find -L ...
вместо просто find ...
, чтобы также найдите символические ссылки на исполняемых файлов .
Обратите внимание, что самый простой файлово-ориентированный случай - ищите executables с битом разрешений для исполняемого файла, установленным для ВСЕХ трех участников безопасности (пользователь, группа, другое) - обычно , но не обязательно даст те же результаты, что и сценарий, ориентированный на пользователя - иважно понимать разницу.
Ориентированный на пользователя (-executable
)
принятый ответ похвально рекомендует -executable
, IF GNU find
доступен.
- GNU
find
поставляется с большинством Linux дистрибутивов - Для сравненияПлатформы на базе BSD, включая macOS, поставляются с BSD find, который является менее мощным.
- Как требует сценарий,
-executable
соответствует только файлам текущего пользователя может выполнить (есть крайние случаи. [1] ).
Альтернатива BSD find
предложенный принятым ответом (-perm +111
) отвечает на другой , файл -центрический вопрос (в качестве ответа егоэльф заявляет).
- Использование только
-perm
для ответа на user -центрический вопрос невозможно , потому что то, что нужно соотносит идентификатор пользователя и группы файла *1118* с текущего пользователя , тогда как -perm
может проверять только разрешения файла *1123*.
Используя только POSIX find
функции , на вопрос невозможно ответить без привлечения внешних утилит. Таким образом, лучшее, что может -perm
сделать (само по себе)) является приближением из -executable
. Возможно, приближение ближе , чем -perm +111
, равно -perm -111
, чтобы найти файлы, для которых установлен исполняемый бит для ВСЕХ участников безопасности (пользователь, группа, другие) - это поражаетя как типичный сценарий реального мира.В качестве бонуса он также совместим с POSIX (используйте find -L
для включения символических ссылок, объяснение см. Ниже):
find . -type f -perm -111 # or: find . -type f -perm -a=x
ответ gniourf_gniourf дает истинный, переносимый эквивалент -executable
с использованием -exec test -x {} \;
, хотя и за счет производительности .
Объединение -exec test -x {} \;
с -perm +111
(т. Е. Файлы с по крайней мере одним установленным исполняемым битом) могут повысить производительность в этом exec
не нужно вызывать для каждого файла (ниже используется POSIX-совместимый эквивалент BSD find -perm +111
/ GNU find -perm /111
; подробности см. ниже):
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Файлово-ориентированный (-perm
)
- К ответ Файл -центрические вопросы , его достаточно для использования POSIX-совместимого
-perm
первичного (известного как test в терминологии поиска GNU). -perm
позволяет проверять любые права доступа к файлу, а не только исполняемость. - Разрешения указываются как восьмеричные или символические режимы . Восьмеричные моды - это восьмеричные числа (например,
111
), тогда как символические моды - это строки (например, a=x
).
- Символьные режимы идентифицируют участников безопасности как
u
(пользователь), g
(группа) и o
(другое) или a
для обозначения всех трех. Разрешения выражаются, например, как x
для исполняемого файла и присваиваются принципалам с использованием операторов =
, +
и -
; полное обсуждение, включая восьмеричные режимы, см. в спецификации POSIX для утилиты chmod
.
- В контексте
find
:
- Префикс режима с
-
(например, -ug=x
) означает: сопоставлять файлы, которые имеют все разрешения , указанные (но сопоставление файлов может иметь дополнительные разрешения).
- Наличие НЕТ префикса (например,
755
) означает: сопоставлять файлы, которые имеют этот полный, точный набор разрешений.
- Предупреждение : Оба GNU find и BSD find реализуют дополнительный нестандартный префикс с с ЛЮБОЙ из -установленная логика установленных битов разрешений , но с несовместимым синтаксисом :
- BSD найти:
+
- GNU находка:
/
[2]
- Поэтому избегайте этих расширений, если ваш код должен быть переносимый .
- Приведенные ниже примеры демонстрируют переносимые ответы на различные файловые вопросы.
Примеры файлово-ориентированных команд
Примечание:
- Следующие примеры являются POSIX-совместимыми , что означает, что они должны работать в любой POSIX-совместимой реализации, включая GNU find и BSD find; в частности, для этого необходимо:
- НЕ использовать префиксы нестандартного режима
+
или /
.
- Использование форм POSIX основных логических операторов :
!
для NOT (GNU-поиск и BSD-поиск также позволяют -not
); обратите внимание, что \!
используется в примерах для защиты !
от расширений истории оболочки
-a
для AND (GNU-поиск и BSD-поиск также позволяют -and
)
-o
для ИЛИ (GNU-поиск и BSD-поиск также позволяют -or
)
- В примерах используются символические режимы, потому что их легче читать и запоминать.
- С префиксом режима
-
операторы =
и +
могут использоваться взаимозаменяемо
(например, -u=x
эквивалентно -u+x
- если только вы не примените -x
позже, но делать это бессмысленно).
- Используйте
,
, чтобы присоединиться к частичным режимам; И логика подразумевается; например, -u=x,g=x
означает, что для пользователя и должен быть установлен исполняемый бит группы.
- Режимы не могут сами по себе выражать отрицательное сопоставление в смысле «сопоставлять только, если этот бит НЕ установлен»; Вы должны использовать отдельное выражение
-perm
с основным НЕ, !
.
- Обратите внимание, что основных цветов find (таких как
-print
или -perm
; также известны как actions и tests в GNU find) - неявно объединено с -a
(логическое И), и что -o
и, возможно, круглые скобки (экранированные как \(
и \)
для оболочки) необходимы для реализации логики ИЛИ.
find -L ...
вместо просто find ...
используется для того, чтобы также сопоставить символические ссылки с исполняемыми файлами
-L
дает указание найти для оценки целей символических ссылок вместо самих символических ссылок; следовательно, без -L
, -type f
полностью проигнорирует символические ссылки.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Описание -executable
из man find
по состоянию на GNU найти 4.4.2:
Соответствует исполняемым файлам и каталогам, доступным для поиска (в смысле разрешения имен файлов). Это учитывает доступконтрольные списки и другие артефакты разрешений, которые игнорирует тест -perm. Этот тест использует системный вызов access (2), и поэтому может быть
одурачены серверами NFS, которые выполняют сопоставление UID (или сжатие корня), так как многие системы реализуют доступ (2) в ядре клиента и поэтому не могут
использовать информацию отображения UID, хранящуюся на сервере. Поскольку этот тест основан только на результате системного вызова access (2),
не гарантируется, что файл, для которого этот тест успешно пройден, действительно может быть выполнен.
[2] GNU находит версии старше, чем 4.5.12 , также допускается префикс +
, но он сначала устарел и в конечном итоге был удален, поскольку объединение +
с symbolic * Режимы 1404 * дают вероятные неожиданные результаты из-за того, что интерпретируются как точная маска разрешений. Если вы (а) запускаете версию до 4.5.12 и (b), ограничиваетесь только восьмеричными режимами, вы может избежать использования +
с и GNU find и BSD find, но это не очень хорошая идея.