Astuce du chapeau à @ gniourf_gniourf pour éclaircir une idée fausse fondamentale.
Cette réponse tente de donner un aperçu des réponses existantes et de discuter de leurs subtilités et de leurs mérites relatifs ainsi que de fournir des informations de base , en particulier en ce qui concerne la portabilité .
La recherche de fichiers exécutables peut faire référence à deux cas d'utilisation distincts :
- centré sur l'utilisateur : recherchez les fichiers exécutables par l'utilisateur actuel .
- fichier-centrique : trouver les fichiers qui ont (un ou plusieurs) bits d'autorisation exécutable ensemble .
Notez que dans les deux scénarios, il peut être judicieux d' utiliserfind -L ...
au lieu de juste find ...
pour trouver également des liens symboliques vers des exécutables .
Notez que le cas le plus simple centré sur les fichiers - rechercher des exécutables avec le bit d'autorisations exécutable défini pour TOUS les trois principaux de sécurité (utilisateur, groupe, autre) - produira généralement , mais pas nécessairement, les mêmes résultats que le scénario centré sur l'utilisateur - et c'est important de comprendre la différence.
Centré sur l'utilisateur ( -executable
)
le réponse acceptée recommande vivement -executable
, IF GNU find
est disponible.
- GNU
find
est fourni avec la plupart des distributions
Linux
- En revanche, les plates-formes basées sur BSD, y compris macOS, sont livrées avec BSD find, qui est moins puissant.
- Comme le scénario l'exige,
-executable
ne fait correspondre que les fichiers utilisateur actuel peut exécuter (il existe des cas extrêmes. [1] ).
L' alternative BSD find
offerte par la réponse acceptée ( -perm +111
) répond à une autre , centrée sur le fichier (comme l'indique la réponse elle-même).
- Il est impossible d' utiliser uniquement
-perm
pour répondre à la question centrée sur l' utilisateur , car il est nécessaire de relier l' identité de l'utilisateur et du groupe du fichier à l' utilisateur actuel , alors que -perm
vous ne pouvez tester que le fichier. autorisations .
En utilisant uniquement les find
fonctionnalités POSIX , il est impossible de répondre à la question sans impliquer des utilitaires externes.
Ainsi, le mieux que l' -perm
on puisse faire (par lui-même) est une approximation de -executable
. Peut-être une approximation plus proche que ne l' -perm +111
est-perm -111
, afin de trouver des fichiers dont le bit exécutable est défini pour TOUS les principaux de sécurité (utilisateur, groupe, autre) - cela me semble être le scénario typique du monde réel. En prime, il est également compatible POSIX (utilisez find -L
pour inclure des liens symboliques, voir plus loin ci-dessous pour une explication):
find . -type f -perm -111 # or: find . -type f -perm -a=x
La réponse de gniourf_gniourf fournit un véritable équivalent portable de l'-executable
utilisation-exec test -x {} \;
, mais au détriment des performances .
La combinaison -exec test -x {} \;
avec -perm +111
(c'est-à-dire des fichiers avec au moins un ensemble de bits exécutables) peut améliorer les performances dans la mesure où il exec
n'est pas nécessaire d'appeler pour chaque fichier (ce qui suit utilise l'équivalent compatible POSIX de BSD find -perm +111
/ GNU find-perm /111
; voir plus loin ci-dessous pour une explication) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Centré sur les fichiers ( -perm
)
- Pour répondre fichiers des questions -centric , il est suffisant d'utiliser le conforme aux spécifications POSIX
-perm
primaire (appelé essai dans la terminologie de trouver GNU).
-perm
vous permet de tester toutes les autorisations de fichier, pas seulement l'exécutabilité.
- Les autorisations sont spécifiées en mode octal ou symbolique . Les modes octaux sont des nombres octaux (par exemple,
111
), tandis que les modes symboliques sont des chaînes (par exemple, a=x
).
- Les modes symboliques identifient les principaux de sécurité comme
u
(utilisateur), g
(groupe) et o
(autre), ou a
pour faire référence aux trois. Les autorisations sont exprimées comme x
pour l'exécutable, par exemple, et attribuées aux principaux à l'aide d'opérateurs =
, +
et -
; pour une discussion complète, y compris des modes octaux, voir la spécification POSIX pour lechmod
utilitaire .
- Dans le contexte de
find
:
- Préfixer un mode avec
-
(par exemple, -ug=x
) signifie: faire correspondre les fichiers qui ont toutes les autorisations spécifiées (mais les fichiers correspondants peuvent avoir des autorisations supplémentaires).
- N'ayant AUCUN préfixe (par exemple
755
) signifie: faire correspondre les fichiers qui ont ceci complet et exact d'autorisations.
- Avertissement : GNU find et BSD find implémentent tous deux un préfixe non standard supplémentaire avec une logique de jeu de bits d'autorisations spécifiées , mais faites-le avec une syntaxe incompatible :
- BSD trouver:
+
- Recherche GNU:
/
[2]
- Par conséquent, évitez ces extensions, si votre code doit être portable .
- Les exemples ci-dessous présentent des réponses portables à diverses questions centrées sur les fichiers.
Exemples de commandes centrées sur les fichiers
Remarque:
- Les exemples suivants sont compatibles POSIX , ce qui signifie qu'ils devraient fonctionner dans n'importe quelle implémentation compatible POSIX, y compris GNU find et BSD find; spécifiquement, cela nécessite:
- N'utilisez PAS de préfixes de mode non standard
+
ou /
.
- Utilisation des formes POSIX des primaires d'opérateurs logiques :
!
pour NOT (GNU find et BSD find autorisent également -not
); notez qu'il \!
est utilisé dans les exemples pour se protéger !
des extensions d'historique du shell
-a
pour AND (GNU find et BSD find autorisent également -and
)
-o
pour OR (GNU find et BSD find autorisent également -or
)
- Les exemples utilisent des modes symboliques , car ils sont plus faciles à lire et à mémoriser.
- Avec le préfixe de mode
-
, les opérateurs =
et +
peuvent être utilisés de manière interchangeable (par exemple, -u=x
équivaut à -u+x
- sauf si vous appliquez -x
plus tard, mais cela ne sert à rien).
- Utilisez
,
pour rejoindre les modes partiels; ET la logique est implicite; par exemple, cela -u=x,g=x
signifie que l'utilisateur et le bit exécutable de groupe doivent être définis.
- Les modes ne peuvent pas eux-mêmes exprimer une correspondance négative dans le sens de "correspondance uniquement si ce bit n'est PAS activé"; vous devez utiliser une distincte
-perm
expression avec NOT primaire, !
.
- Notez que les primaires de find (telles que
-print
, ou -perm
; également connues sous le nom d' actions et de tests dans GNU find) sont implicitement jointes avec -a
(AND logique), et que -o
, éventuellement entre parenthèses (échappées comme \(
et\)
pour le shell) sont nécessaires pour implémenter la logique OR.
find -L ...
au lieu de juste find ...
est utilisé afin de faire correspondre également les liens symboliques à exécutables
-L
indique à find d'évaluer les cibles des liens symboliques au lieu des liens symboliques eux-mêmes; par conséquent, sans -L
, -type f
ignorerait complètement les liens symboliques.
# 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] Description de à -executable
partir man find
de GNU find 4.4.2:
Correspond aux fichiers exécutables et aux répertoires pouvant faire l'objet d'une recherche (dans un sens de résolution de nom de fichier). Cela prend en compte les listes de contrôle d'accès et d'autres artefacts d'autorisations que le test -perm ignore. Ce test utilise l'appel système access (2), et peut donc être trompé par les serveurs NFS qui effectuent un mappage UID (ou écrasement de racine), car de nombreux systèmes implémentent access (2) dans le noyau du client et ne peuvent donc pas utiliser les informations de mappage UID conservées sur le serveur. Etant donné que ce test est basé uniquement sur le résultat de l'appel système access (2), il n'y a aucune garantie qu'un fichier pour lequel ce test réussit puisse réellement être exécuté.
[2] Les versions de GNU find antérieures à 4.5.12 autorisaient également le préfixe +
, mais cela a d'abord été déconseillé et finalement supprimé, car la combinaison +
avec des modes symboliques donne probablement des résultats inattendus car elle est interprétée comme un masque d'autorisations exact . Si vous (a) exécutez sur une version antérieure à la 4.5.12 et (b) vous vous limitez aux modes octaux uniquement, vous pourriez vous en sortir en utilisant +
à la fois GNU find et BSD find, mais ce n'est pas une bonne idée.