Quel type de paramètre/flag puis-je utiliser avec l'option Unix find
pour que je recherche les exécutables ?
Seulement quelques milliers de cas supplémentaires, et vous aurez réinventé file
!
Quel type de paramètre/flag puis-je utiliser avec l'option Unix find
pour que je recherche les exécutables ?
@tripleee +1. Cool serait cette extension : find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
@Daniel Alder, quelle version de find utilisez-vous ? Je n'ai pas trouvé l'option -mime dans find (GNU findutils) 4.4.2
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é.
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
(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.
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.
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.
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 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.
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.0 votes
Également pertinent : Comment trouver les fichiers exécutables sous un certain répertoire sous linux ?
0 votes
Me n'aime pas toutes les propositions présentées ci-dessous qui sont basées sur les autorisations de fichiers. Argument : pour mon système d'exploitation GNU (Ubuntu) il est possible de mettre le drapeau "x" (exécutable) pour par exemple un fichier texte ASCII. Aucune mimique n'a empêché cette opération d'aboutir. Il suffit d'une petite erreur ou d'un bug pour que plusieurs fichiers non intentionnels se voient attribuer le drapeau "x". C'est pourquoi la solution de gniourf_gniourf est ma préférée. Elle a cependant l'inconvénient de nécessiter un émulateur ou un dispositif cible pour les exécutables compilés de manière croisée.