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
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.
-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 trueif at least all of
the bits in the mode are setin 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 trueif 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.
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:Algol68 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.
-L
au lieu de-or -type l
pour provoquer tous lesstat
appels effectués parfind
pour renvoyer les statistiques du fichier lié, et non le lien lui-même.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:
modifier la mise à jour
Cela semble aussi fonctionner!
Je suppose que le "x" n'a pas de sens sans les spécificateurs utilisateur / groupe / autres.
la source
À partir de la page de manuel pour rechercher dans OS X :
Il vous faut donc:
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'
find
une 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.la source
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: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):
J'espère que cela sera utile à quelqu'un qui cherche également une réponse à la même question.
Remarque:
file
ne semble pas avoir de fonction de récurrence via les sous-répertoires.la source