2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire dans Linux ?

Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire dans Linux ?

Réponses (7)

170
170
170
2009-09-10 11:59:26 +0000

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

find <dir> -executable

si vous souhaitez trouver uniquement des fichiers exécutables et non des répertoires consultables, combinez avec -type f :

find <dir> -executable -type f
35
35
35
2009-09-10 15:55:13 +0000

Utilisez l'option find’s -perm. Cela permettra de trouver des fichiers dans le répertoire courant qui sont soit exécutables par leur propriétaire, par les membres du groupe ou par d'autres :

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.

16
16
16
2017-06-01 06:59:33 +0000

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
3
3
3
2016-04-24 02:38:26 +0000

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

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

Je préfère cela parce que cela ne repose pas sur -executable qui est spécifique à la plate-forme ; et cela ne repose pas sur -perm qui est un peu obscur, un peu spécifique à la plate-forme, et comme écrit ci-dessus, cela exige que le fichier soit exécutable pour tout le monde (pas seulement pour vous).

Le -type f est important parce que dans *nix les répertoires doivent être exécutables pour pouvoir être parcourus, et plus la requête est dans la commande find, plus votre commande sera efficace en mémoire.

Quoi qu'il en soit, je propose juste une autre approche, puisque *nix est le pays des milliards d'approches.

2
2
2
2014-03-26 07:52:24 +0000

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
1
1
1
2017-07-09 12:31:14 +0000

En tant qu'adepte de la ligne unique…

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Utilisation de “xargs” pour prendre la sortie de la commande find (en utilisant print0 pour s'assurer que les noms de fichiers avec des espaces sont traités correctement). Nous avons maintenant une liste de fichiers qui sont exécutables et nous les fournissons, un par un, comme paramètre de la commande “file”. Ensuite, nous utilisons le terme ASCII pour ignorer les 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 ‘NIX OS

J'ai eu besoin de ce qui précède pour trouver des fichiers avec eval dans des scripts appartenant à root, j'ai donc créé ce qui suit pour aider à trouver les faiblesses de l'escalade privée lorsque l'utilisateur root exécute des scripts avec des paramètres dangereux…

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
0
0
0
2019-06-06 00:08:27 +0000

J'ai créé une fonction dans ~/.bashrc ce soir pour trouver les fichiers exécutables qui ne sont pas dans le chemin du système et pas dans les répertoires :

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
        && echo "executable: $1"' _ {}
} # xlocate ()

L'avantage est qu'il va chercher trois distros Linux et une installation Windows en moins d'une seconde où la commande find prend 15 minutes.

Par exemple :

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real 0m0.504s
user 0m0.487s
sys 0m0.018s

Ou pour un répertoire entier et tous ses sous-répertoires :

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s

関連する質問

6
10
11
7
3