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


19

J'ai un dossier myfolderqui 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

Réponses:


29

Cela trouvera tous les fichiers (pas les liens symboliques) avec le jeu de bits exécutables:

find . -perm +111 -type f

Cela trouvera également des 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 find (:
  • .fait référence au répertoire dans lequel commencer la recherche ( .= répertoire actuel)
  • -perm +111= avec l'un des bits exécutables défini ( +signifie "n'importe lequel de ces bits", 111est l'octal du bit exécutable sur le propriétaire, le groupe et n'importe qui)
  • -type fsignifie que le type est un fichier
  • -or booléen OU
  • -type lsignifie que le type est un lien symbolique

2
Vous pouvez utiliser -Lau lieu de -or -type lpour provoquer tous les statappels effectués par findpour renvoyer les statistiques du fichier lié, et non le lien lui-même.
Ian C.

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 foirée.
Ivan Z. Xiao

5

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

find . -type f -perm +0111 -print

modifier la mise à jour

Cela semble aussi fonctionner!

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

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


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

Curieusement, cette section de la page de manuel 10.6 est exactement la même que celle que vous avez citée ... ce qui était suffisant pour me faire creuser un peu plus et voir ce qui se passait. Modifié ma réponse ci-dessus.
Kent

2
Conclusion: la syntaxe des commandes BDS est bizarre.
Ian C.

3

À partir de la page de manuel pour rechercher 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 (``-'').

Il vous faut donc:

find . -type f -perm +0111 -print

N'oubliez pas que OS X est basé sur BSD , pas sur Linux, donc les commandes Gnu auxquelles vous êtes habitué dans les distributions Linux (dont l' findune d'entre elles) 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 entre les systèmes d'exploitation et les outils utilitaires du système d'exploitation.


1

Une très vieille question, je le sais, mais à la recherche d'une solution, j'ai peut-être trouvé une meilleure réponse.

Le problème principal avec l'utilisation de "find" est qu'il repose sur un attribut défini sur 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 pratique " file", qui affiche des informations sur les fichiers, 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 voir, «MyProgram» est un exécutable, et bien indiqué comme tel. Étant donné que les anciens exécutables 32 bits auront également la phrase "exécutable", ce qui suit devrait répertorier tous les vrais exécutables (binaires):

file * | grep "executable"

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

Remarque: filene semble pas avoir de fonction de récurrence via les sous-répertoires.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.