Comment trouver tous les exécutables binaires dans un répertoire?

46

Si j'utilise une findcommande comme celle-ci:

find /mydir/mysubdir -executable -type f

tous les fichiers exécutables sont répertoriés (à l'exclusion des répertoires) et incluent les fichiers de script exécutables (tels que script.sh, etc.). Ce que je veux faire est de ne lister que les fichiers exécutables binaires.

uray
la source
1
Veuillez modifier le sujet pour inclure le mot "binaire", ce qui est essentiel pour répondre à votre question.
Stefan Lasiewski

Réponses:

44

Vous pourriez essayer l' fileutilitaire. Selon la page de manuel:

Les tests magiques permettent de rechercher des fichiers contenant des données dans des formats particuliers. L'exemple canonique de cela est un fichier a.out exécutable (programme compilé) binaire, dont le format est défini dans, et éventuellement dans le répertoire d'inclusion standard.

Vous pourriez avoir à jouer avec l'expression régulière, mais quelque chose comme:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

Le fichier contient de nombreuses options. Vous voudrez peut-être jeter un coup d’œil à la page de manuel. J'ai utilisé la première option que j'ai trouvée qui semblait produire une sortie facile à grep.

Steven D
la source
15
Je dirais utiliser find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Il ne vous donnera que des fichiers (et peut donc être passé à la prochaine commande qu'il veut exécuter)
Gert
La solution serverfault.com/a/584595/211551 recherche les fichiers qui ne sont PAS marqués comme étant exécutables, mais qui sont exécutables.
user2067125
Sous OS X, vous pouvez installer GNU findavec brew install findutilsou sudo port install findutils, puis vous pouvez exécuter une invocation comme celle-ci avec un effet similaire:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2,
7

Voici un moyen d’exclure des scripts, c’est-à-dire des fichiers dont les deux premiers caractères sont #!:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

Pour certains types de fichiers, il n'est pas clair si vous souhaitez les classer en tant que scripts ou binaires, par exemple, des fichiers de type bytecode. Selon la manière dont les choses sont configurées, celles-ci peuvent commencer ou non #!. Si cela vous importe, vous devrez rendre le script de shell interne plus complexe. Par exemple, voici comment inclure des fichiers binaires ELF, des exécutables Mono et des programmes de bytecode Objective Caml, mais pas d’autres types d’exécutables tels que des scripts shell, des scripts perl ou des programmes de bytecode JVM:

find -type f -executable -exec sh -c '
    case "$(head -n 1 "$1")" in
       ?ELF*) exit 0;;
       MZ*) exit 0;;
       #!*/ocamlrun*) exit 0;;
    esac
    exit 1
' sh {} \; -print
Gilles, arrête de faire le mal
la source
2

Juste au cas où vous vous retrouveriez sur un système avec un niveau inférieur find(il existe toujours, comme je l’écris, beaucoup de grappes scientifiques fonctionnant sous RHEL5!) Sans les droits de mise à jour: au lieu de

find /mypath/ -executable -type f

dans les excellentes réponses ci-dessus, vous pouvez faire, par exemple,

find /mypath/h -type f -perm -u+x

qui recherche sur les bits de permission. Malheureusement, ce qui précède ne trouve que les fichiers pour lesquels l'utilisateur dispose d'un exécutable, mais cela fonctionne généralement pour moi.

TomRoche
la source
Cela trouverait toujours des scripts exécutables, pas seulement des fichiers binaires.
Kusalananda