196 votes

Comment trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux ?

Comment trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux ?

192voto

Martin Points 3802

La vérification des fichiers exécutables peut être faite avec -perm (non recommandé) ou -executable (recommandé, car il tient compte de l'ACL). Pour utiliser le -executable option :

find <dir> -executable

si vous voulez trouver uniquement les fichiers exécutables et non les répertoires interrogeables, combinez avec -type f :

find <dir> -executable -type f

38voto

jms Points 318

Utilisez la recherche -perm option. Cela permettra de trouver les fichiers dans le répertoire actuel qui sont exécutables par leur propriétaire, par les membres du groupe ou par d'autres personnes :

find . -perm /u=x,g=x,o=x

Edit :

Je viens de trouver une autre option qui est présente au moins dans GNU find 4.4.0 :

find . -executable

Cela devrait fonctionner encore mieux car les ACL sont également prises en compte.

34voto

8jean Points 2506

Je sais que la question mentionne spécifiquement Linux, mais comme c'est le premier résultat sur Google, je voulais juste ajouter la réponse que je cherchais (par exemple si vous êtes - comme moi en ce moment - forcé par votre employeur à utiliser un système non GNU/Linux).

Testé sur macOS 10.12.5

find . -perm +111 -type f

7voto

Mark McKenna Points 206

J'ai une autre approche, au cas où ce que vous voulez vraiment, c'est juste faire quelque chose avec les fichiers exécutables - et pas nécessairement forcer find à se filtrer lui-même :

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Je préfère cette méthode car elle ne repose pas sur -executable qui est spécifique à la plate-forme ; et il ne s'appuie pas sur les éléments suivants -perm ce qui est un peu obscur, un peu spécifique à une plateforme, et comme écrit ci-dessus, exige que le fichier soit exécutable pour tout le monde (pas seulement pour vous).

El -type f est important car, dans *nix, les répertoires doivent être exécutables pour pouvoir être traversés, et plus la requête se trouve dans le fichier find plus votre commande sera efficace en termes de mémoire.

Quoi qu'il en soit, je propose simplement une autre approche, puisque *nix est le pays d'un milliard d'approches.

5voto

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 :

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X