Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux?
linux
command-line
bash
find
HaiYuan Zhang
la source
la source
file
commande standard ?ls -l | egrep '^[^d]..x..x..x.*$'
La liste ci-dessus répertorie tous les exécutables (pour tous / utilisateur et groupe) dans le répertoire actuel. Remarque : l'-executable
option ne fonctionne pas sur Mac, d'où la solution de contournement ci-dessus.-rwxr-x---
), qui est toujours exécutable par certains utilisateurs.Réponses:
La recherche de fichiers exécutables peut être effectuée avec
-perm
(non recommandé) ou-executable
(recommandé, car elle prend en compte ACL). Pour utiliser l'-executable
option:Si vous souhaitez rechercher uniquement des fichiers exécutables et non des répertoires interrogeables, combinez-les avec
-type f
:la source
-type x
plus.find: invalid predicate -executable'
sur RHELUtilisez l'
-perm
option de recherche. Cela permettra de trouver dans le répertoire en cours des fichiers exécutables par leur propriétaire, par les membres du groupe ou par d’autres personnes:Modifier:
Je viens de trouver une autre option présente au moins dans GNU find 4.4.0:
Cela devrait fonctionner encore mieux, car les listes de contrôle d'accès sont également prises en compte.
la source
find: invalid mode
/ u = x, g = x, o = x'`-perm /111
peut être la version la plus portable.Je sais que la question mentionne spécifiquement Linux, mais comme c'est le premier résultat sur Google, je voulais simplement ajouter la réponse que je cherchais (par exemple, si vous êtes - comme moi en ce moment - contraint par votre employeur d'utiliser un logiciel autre que GNU. / Système Linux).
Testé sur macOS 10.12.5
la source
J'ai une autre approche, au cas où vous voudriez vraiment faire quelque chose avec des fichiers exécutables - et pas nécessairement forcer find à se filtrer lui-même:
Je préfère ceci car il ne dépend pas de
-executable
ce qui est spécifique à la plate-forme; et il ne dépend pas de-perm
ce qui est un peu obscur, un peu spécifique à la plate-forme, et comme écrit ci-dessus, le fichier doit être exécutable pour tout le monde (pas seulement pour vous).Ceci
-type f
est important parce que, dans * nix, les répertoires doivent être exécutables pour pouvoir être parcourus, et plus la requête contient de requêtesfind
, plus la commande sera économe en mémoire.Quoi qu'il en soit, nous proposons simplement une autre approche, car * nix est le pays d’un milliard d’approches.
la source
find -perm
, recherche les fichiers pour lesquels un bit d'autorisation d'exécution est défini. (2) En revanche, cette réponse ne trouve que les fichiers pour lesquels l'utilisateur actuel dispose d'une autorisation d'exécution. Certes, c'est peut-être ce que souhaite le PO, mais ce n'est pas clair. … (Suite)`…`
à$(…)
- voyez ceci , ceci et cela . (4) Mais ne fais pasfor i in $(find …); do …
; il échoue sur les noms de fichiers contenant des espaces. Au lieu de cela, faitesfind … -exec …
. (5) Et, lorsque vous travaillez avec des variables de shell, citez-les toujours (entre guillemets) sauf si vous avez une bonne raison de ne pas le faire et que vous êtes certain de savoir ce que vous faites.-perm
argument comme exigeant les trois, pas un. Merci également pour vos commentaires sur la protection des arguments de shell, c'est tout ce dont je n'étais pas au courant.for i in
trouver. -type f; do [ -x $i ] && echo "$i is executable"; done
; vous manquez la partie <dir>, que j'utilise avec un point (.)Un fichier marqué comme exécutable ne doit pas nécessairement être un fichier ou un objet exécutable ou chargeable.
Voici ce que j'utilise:
la source
-name "*"
n'a aucun effetfind
- il trouve normalement tous les fichiers qui ne sont pas éliminés par les tests.En tant que fan du one liner ...
Utilisation de 'xargs' pour extraire le résultat de la commande find (en utilisant print0 pour s'assurer que les noms de fichiers avec des espaces sont gérés correctement). Nous avons maintenant une liste de fichiers exécutables et nous les fournissons, un par un, en tant que paramètre de la commande 'file'. Puis grep pour le terme ASCII ignorer les fichiers binaires. Veuillez remplacer -executable dans la commande find par le style que vous préférez (voir les réponses précédentes) ou par ce qui fonctionne sur votre système d'exploitation NIX.
J'avais besoin de ce qui précède pour trouver des fichiers avec eval dans des scripts appartenant à root. C'est pourquoi nous avons créé ce qui suit pour aider à trouver les faiblesses de l'escalade privée dans lesquelles l'utilisateur root exécute des scripts avec des paramètres non sécurisés ...
la source
file
rapporte l'encodage, donc un script python peut être rapporté commea /usr/bin/python script, UTF-8 Unicode text executable
.find ... | xargs file -b | grep -v '^ELF'
pourrait mieux fonctionner pour repérer les non-binaires.J'ai créé une fonction
~/.bashrc
ce soir pour trouver les fichiers exécutables qui ne se trouvent pas dans le chemin du système ni dans les répertoires:L'avantage est qu'il recherchera trois distributions Linux et une installation Windows en moins d'une seconde, la
find
commande prenant 15 minutes.Par exemple:
Ou pour tout un répertoire et tous ses sous-marins:
la source