26 votes

Trouver tous les fichiers exécutables dans un dossier dans le terminal

J'ai un dossier myfolder qui contient une énorme hiérarchie de fichiers/dossiers.
Comment trouver tous les fichiers exécutables dans ce dossier ?

Sur Ubuntu, cela fonctionne : find . -executable -type f

Mais Mac OS X Mavericks (qui utilise également bash ) ne parvient pas à l'obtenir :

find: -executable: unknown primary or operator

39voto

Shuft Points 420

Ceci trouvera tous les fichiers (pas les liens symboliques) avec le bit exécutable activé :

find . -perm +111 -type f

Cela permettra également trouver les liens symboliques (qui sont souvent tout aussi importants)

find . -perm +111 -type f -or -type l

Voici comment fonctionne la commande si ce n'est pas évident :

  • find est évidemment le programme de recherche ( :
  • . fait référence au répertoire dans lequel il faut commencer à chercher ( . = répertoire actuel)
  • -perm +111 = avec l'un des bits exécutables activés ( + signifie "n'importe lequel de ces bits", 111 est l'octal pour le bit exécutable sur le propriétaire, le groupe et quiconque)
  • -type f signifie que le type est un fichier
  • -or booléen OR
  • -type l signifie que le type est un lien symbolique

2 votes

Vous pouvez utiliser -L au lieu de -or -type l de provoquer une stat les appels passés par find pour retourner les statistiques du fichier lié, et non le lien lui-même.

1 votes

Le problème que j'ai trouvé avec cette approche est que n'importe quel fichier peut avoir l'autorisation d'exécution. Par exemple, après avoir téléchargé un fichier texte à partir de Windows, l'autorisation est brouillée.

5voto

Kent Points 6002

Je n'ai pas pu faire fonctionner la réponse de Ian (10.6.8), mais la suivante a donné les résultats attendus :

find . -type f -perm +0111 -print

mise à jour

Cela semble fonctionner aussi bien !

find . -type f -perm +ugo+x -print

Je suppose que le "x" n'a pas de sens sans les spécificateurs utilisateur/groupe/autres.

0 votes

La syntaxe symbolique doit être nouvelle - merci de l'avoir signalé. J'ai mis à jour ma réponse afin qu'elle utilise les octaux et qu'elle soit rétrocompatible avec les anciennes versions d'OS X.

0 votes

Curieusement, cette section de la page de manuel 10.6 est exactement la même que celle que vous avez citée...., ce qui a suffi à me faire creuser un peu plus et à voir ce qui se passait. J'ai modifié ma réponse ci-dessus.

2 votes

Conclusion : La syntaxe des commandes BDS est bizarre.

4voto

shsteimer Points 8749

De la page de manuel de find dans OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Donc vous avez besoin :

find . -type f -perm +0111 -print

Rappelez-vous que OS X est Basé sur BSD n'est pas basée sur Linux, donc les commandes Gnu auxquelles vous êtes habitués dans les distributions Linux (dont les suivantes find est l'un d'entre eux) ne sont pas nécessairement les mêmes que dans OS X. Ce n'est pas une différence de shell, c'est une différence de système d'exploitation/outils utilitaires du système d'exploitation.

3voto

Hanzaplastique Points 283

Une très vieille question, j'en suis conscient, mais en cherchant une solution, j'ai peut-être trouvé une meilleure réponse.

Le principal problème de l'utilisation de "find" est qu'il repose sur un attribut défini comme exécutable, même si cet attribut est défini pour un fichier non exécutable.

MacOS est livré avec un petit outil de ligne de commande très pratique " file ", qui affiche des informations sur le fichier, par exemple :

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Comme vous pouvez le constater, "MonProgramme" est un exécutable, et il est bien indiqué comme tel. Étant donné que les anciens exécutables 32 bits comportent également l'expression "exécutable", la liste suivante devrait énumérer tous les véritables exécutables (binaires) :

file * | grep "executable"

J'espère que cela sera utile à quelqu'un qui cherche une réponse à la même question.

Note : file ne semble pas avoir de fonction de récursion dans les sous-répertoires.

2voto

Danny atGER Points 1

Je pense que @Hanzaplastique est sur la bonne voie, mais pour faire 'find' correctement, j'utiliserais :

find . -type f -exec bash -c "file {} | grep 'executable'" \;

Vous pouvez également ajouter -name "*some_wild_card*" après le . pour filtrer un type spécifique d'exécutables. Et bien sûr, vous pouvez remplacer bash avec votre coquillage préféré.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X