Finden Sie alle ausführbaren Dateien in einem Ordner im Terminal

Ich habe einen Ordner myfolder, der eine riesige Hierarchie von Dateien/Ordnern enthält.
Wie finde ich alle ausführbaren Dateien in diesem Ordner?

Unter Ubuntu funktioniert das:find . -executable -type f

Aber Mac OS X Mavericks (das auch verwendet bash) kann es nicht bekommen:

find: -executable: unknown primary or operator

Antworten (5)

Dadurch werden alle Dateien (keine Symlinks) mit gesetztem ausführbarem Bit gefunden:

find . -perm +111 -type f

Dadurch werden auch Symlinks gefunden (die oft ebenso wichtig sind)

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

So funktioniert der Befehl, wenn es nicht offensichtlich ist:

  • findist offensichtlich das Suchprogramm (:
  • .bezieht sich auf das Verzeichnis, in dem die Suche beginnen soll ( .= aktuelles Verzeichnis)
  • -perm +111= mit einem der ausführbaren Bits gesetzt ( +bedeutet "jedes dieser Bits", 111ist das Oktal für das ausführbare Bit für Besitzer, Gruppe und irgendjemand)
  • -type fbedeutet, dass der Typ eine Datei ist
  • -orboolesches ODER
  • -type lbedeutet, dass der Typ ein symbolischer Link ist
Sie können -Lanstelle von verwenden -or -type l, um alle statAufrufe von finddazu zu veranlassen, die Statistiken der verknüpften Datei zurückzugeben, nicht den Link selbst.
Das Problem, das ich bei diesem Ansatz gefunden habe, ist, dass jede Datei die Ausführungsberechtigung haben kann. Nachdem Sie beispielsweise eine Textdatei von Windows heruntergeladen haben, ist die Berechtigung durcheinander.

Ich konnte Ians Antwort nicht zum Laufen bringen (10.6.8), aber das Folgende lieferte die erwarteten Ergebnisse:

find . -type f -perm +0111 -print

Aktualisierung bearbeiten

Das scheint auch zu funktionieren!

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

Ich denke, das "x" ist ohne die Benutzer-/Gruppen-/anderen Spezifizierer bedeutungslos.

Die symbolische Syntax muss neu sein - danke für den Hinweis. Ich habe meine Antwort so aktualisiert, dass sie Oktale verwendet und mit älteren OS X-Versionen abwärtskompatibel ist.
Seltsamerweise ist dieser Abschnitt der 10.6-Manpage genau der gleiche wie das, was Sie zitiert haben ... was ausreichte, um mich ein wenig tiefer zu graben und zu sehen, was zum Teufel los war. Habe meine Antwort oben geändert.
Fazit: Die BDS-Befehlssyntax ist seltsam.

Aus der Manpage für find in 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 (``-'').

Deswegen brauchst du:

find . -type f -perm +0111 -print

Denken Sie daran, dass OS X BSD-basiert ist, nicht Linux-basiert, daher sind die Gnu-Befehle, die Sie in Linux-Distributionen gewohnt sind (von denen findeine davon ist), nicht unbedingt die gleichen wie in OS X. Dies ist nicht der Fall ein Shell-Unterschied, es ist ein Unterschied zwischen Betriebssystem und Betriebssystem-Utility-Tools.

Eine sehr alte Frage, ich bin mir bewusst, aber auf der Suche nach einer Lösung habe ich vielleicht eine bessere Antwort gefunden.

Das Hauptproblem bei der Verwendung von "find" besteht darin, dass es sich auf ein auf ausführbar gesetztes Attribut stützt, selbst wenn dieses Attribut für eine nicht ausführbare Datei gesetzt ist.

MacOS wird mit einem praktischen kleinen Befehlszeilentool " file" geliefert, das Dateiinformationen anzeigt, zum Beispiel:

$> 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

Wie Sie sehen können, ist „MyProgram“ eine ausführbare Datei und als solche gut gekennzeichnet. Da alte ausführbare 32-Bit-Dateien auch den Ausdruck "ausführbar" enthalten, sollten im Folgenden alle echten ausführbaren Dateien (Binärdateien) aufgelistet werden:

file * | grep "executable"

Ich hoffe, dies wird für jemanden nützlich sein, der auch nach einer Antwort auf dieselbe Frage sucht.

Hinweis: filescheint keine Funktion zum Rekursieren durch Unterverzeichnisse zu haben.

Ich glaube, dass @Hanzaplastique auf dem richtigen Weg ist, aber um „find“ richtig zu machen, würde ich Folgendes verwenden:

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

Sie können auch -name "*some_wild_card*"nach dem hinzufügen ., um nach bestimmten Typen von ausführbaren Dateien zu filtern. Und natürlich können Sie sie durch bashIhre Lieblingsschale ersetzen.