128 votes

Recherche de fichiers exécutables à l'aide de la commande find

Quel type de paramètre/flag puis-je utiliser avec l'option Unix find pour que je recherche les exécutables ?

0 votes

Tapez 'man find'. Je pense que l'option '-executable' est celle que vous voulez.

3 votes

find -executable ... mais cela ne garantit pas que tous les fichiers listés s'exécutent réellement.

1 votes

Toutes les implémentations de find sont créés égaux. L'option recommandée par @sje397 et @William peut ne pas être disponible. Il est préférable d'utiliser le solution acceptée montré ci-dessous.

2voto

Cela a fonctionné pour moi et j'ai pensé à partager...

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

14 votes

Seulement quelques milliers de cas supplémentaires, et vous aurez réinventé file !

0 votes

@tripleee +1. Cool serait cette extension : find ./ -mime application/x-sharedlib -o -mime application/x-dosexec

0 votes

@Daniel Alder, quelle version de find utilisez-vous ? Je n'ai pas trouvé l'option -mime dans find (GNU findutils) 4.4.2

1voto

alex gray Points 5089

C'est SO ridicule que ce n'est pas super facile... et encore moins presque impossible . Les mains en l'air, je m'en remets à Apple/Spotlight...

mdfind 'kMDItemContentType=public.unix-executable'

Au moins, ça marche !

0 votes

Bon à savoir mdfind sur OSX. Notez que la commande uour rapporte les exécutables Unix pour les système entier . mdfind -onlyin . 'kMDItemContentType=public.unix-executable' limite les résultats au sous-arbre du répertoire courant. Points d'intérêt mineurs : limiter la recherche à un répertoire spécifique seulement (sans sous-dossiers) n'est apparemment pas supporté. Symlinks aux fichiers exécutables ne sont apparemment jamais inclus. Curieusement, une fois que mdfind a trouvé qu'un fichier est exécutable, ensuite enlever le bit exécutable est no ramassé.

0 votes

Je pense avoir trouvé des bogues dans la façon dont Spotlight détecte/détecte les fichiers exécutables Unix ; j'ai signalé un bogue à Apple, ainsi qu'à la Commission européenne. openradar.me/20162683 . Je vous encourage - et toute autre personne intéressée par cette fonctionnalité - à déposer également un bogue à l'adresse suivante : bug at bugreport.apple.com

0 votes

(Désolé pour le flot de commentaires ; espérons qu'ils sont corrects maintenant) mdfind -onlyin . 'kMDItemContentType=public.unix-executable' se comporte comme find . -type f -perm +111 -print fait. C'est-à-dire qu'il trouve les fichiers avec cualquier bit exécutable activé, ce qui peut donner faux positifs (bien que cela ne soit pas un problème en pratique) - pour vraiment ne trouver que les fichiers exécutables par la commande utilisateur actuel en utilisant BSD find, voir la réponse de @gniourf_gniourf. En utilisant un find -L'avantage de cette solution est qu'elle permet de trouver liens symétriques aux fichiers exécutables également, si on le souhaite (option -L ), qui mdfind ne peut apparemment pas le faire.

1voto

louigi600 Points 440

Eh bien, la réponse facile serait : "vos fichiers exécutables se trouvent dans les répertoires contenus dans votre variable PATH" mais cela ne trouverait pas vraiment vos exécutables et pourrait manquer beaucoup d'exécutables de toute façon.

Je ne connais pas bien Mac mais je pense que "mdfind 'kMDItemContentType=public.unix-executable'" pourrait manquer des choses comme des scripts interprétés.

Si vous pouvez trouver des fichiers dont les bits d'exécution sont activés (qu'ils soient ou non exécutables), alors vous pouvez utiliser la méthode suivante

find . -type f -perm +111 -print

là où l'option "-executable" est prise en charge, un filtre supplémentaire sera effectué en regardant les acl et autres artefacts de permission, mais techniquement, ce n'est pas très différent de "-pemr +111".

Peut-être que dans le futur find supportera "-magic" et vous permettra de rechercher explicitement les fichiers avec un id magique spécifique ... mais alors vous devrez spécifier à fine tous les formats exécutables id magique.

Je n'ai pas connaissance d'une solution facile et techniquement correcte sur unix.

1voto

Peter Gerdes Points 396

Donc, si vous voulez réellement trouver des types de fichiers exécutables (par exemple, des scripts, des binaires ELF etc. etc.) et pas seulement des fichiers avec une exécution autorisation alors vous voulez probablement faire quelque chose comme ceci (où le répertoire courant . peut être remplacé par le répertoire que vous voulez) :

 gfind . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Ou pour ceux d'entre vous qui n'utilisent pas macports (utilisateurs de linux) ou qui n'ont pas installé gnu find comme find que vous voulez :

 find . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Cependant, si vous êtes sous OS X, il est fourni avec un petit utilitaire caché quelque part appelé is_exec qui regroupe ce petit test pour vous afin que vous puissiez raccourcir la ligne de commande si vous le trouvez. Mais cette méthode est plus flexible car vous pouvez facilement remplacer le test == par le test =~ et l'utiliser pour vérifier des propriétés plus complexes comme des fichiers de texte brut exécutables ou toute autre information retournée par votre commande de fichier.


Les règles exactes de citation ici sont assez opaques et je finis par faire des essais et des erreurs, mais j'aimerais bien entendre la bonne explication.

0voto

J'ai eu le même problème, et la réponse se trouvait dans le fichier Code source du dmenu : l'utilitaire stest fait à cet effet. Vous pouvez compiler les fichiers 'stest.c' et 'arg.h' et cela devrait fonctionner. Il y a une page de manuel pour l'utilisation, que j'ai mise là par commodité :

STEST(1)         General Commands Manual         STEST(1)

NAME
       stest - filter a list of files by properties

SYNOPSIS
       stest  [-abcdefghlpqrsuwx]  [-n  file]  [-o  file]
       [file...]

DESCRIPTION
       stest takes a list of files  and  filters  by  the
       files'  properties,  analogous  to test(1).  Files
       which pass all tests are printed to stdout. If  no
       files are given, stest reads files from stdin.

OPTIONS
       -a     Test hidden files.

       -b     Test that files are block specials.

       -c     Test that files are character specials.

       -d     Test that files are directories.

       -e     Test that files exist.

       -f     Test that files are regular files.

       -g     Test  that  files  have  their set-group-ID
              flag set.

       -h     Test that files are symbolic links.

       -l     Test the contents of a directory  given  as
              an argument.

       -n file
              Test that files are newer than file.

       -o file
              Test that files are older than file.

       -p     Test that files are named pipes.

       -q     No  files are printed, only the exit status
              is returned.

       -r     Test that files are readable.

       -s     Test that files are not empty.

       -u     Test that files have their set-user-ID flag
              set.

       -v     Invert  the  sense  of  tests, only failing
              files pass.

       -w     Test that files are writable.

       -x     Test that files are executable.

EXIT STATUS
       0      At least one file passed all tests.

       1      No files passed all tests.

       2      An error occurred.

SEE ALSO
       dmenu(1), test(1)

                        dmenu-4.6                STEST(1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X