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

17

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) bekommt es nicht:

find: -executable: unknown primary or operator
Nicolas Raoul
quelle

Antworten:

27

Dies findet alle Dateien (keine Symlinks) mit dem gesetzten ausführbaren Bit:

find . -perm +111 -type f

Hier finden Sie auch Symlinks (die oft gleich wichtig sind)

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

So funktioniert der Befehl, wenn er nicht offensichtlich ist:

  • find ist natürlich das find programm (:
  • .verweist auf das Verzeichnis, in dem gesucht werden soll ( .= aktuelles Verzeichnis)
  • -perm +111= wenn eines der ausführbaren Bits gesetzt ist ( +bedeutet "eines dieser Bits", 111ist das Oktal für das ausführbare Bit von Eigentümer, Gruppe und irgendjemandem)
  • -type fbedeutet, dass der Typ eine Datei ist
  • -or Boolesches ODER
  • -type lbedeutet, dass der Typ eine symbolische Verknüpfung ist
drfrogsplat
quelle
2
Sie können -Lanstelle von -or -type lveranlassen, dass statAufrufe von finddie Statistiken der verknüpften Datei zurückgeben, nicht die Verknüpfung selbst.
Ian C.
Das Problem, das ich bei diesem Ansatz festgestellt habe, ist, dass jede Datei über die Ausführungsberechtigung verfügen kann. Nachdem Sie beispielsweise eine Textdatei von Windows heruntergeladen haben, ist die Berechtigung ungültig.
Ivan Z. Xiao
4

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

find . -type f -perm +0111 -print

Update bearbeiten

Das scheint auch zu funktionieren!

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

Ich denke, das "x" ist ohne den Benutzer / die Gruppe / andere Spezifizierer bedeutungslos.

Kent
quelle
Die symbolische Syntax muss neu sein - danke, dass Sie darauf hingewiesen haben. Ich habe meine Antwort so aktualisiert, dass sie Oktale verwendet und mit älteren OS X-Versionen abwärtskompatibel ist.
Ian C.
Seltsamerweise ist dieser Abschnitt der 10.6-Hilfeseite genau derselbe wie der, den Sie zitiert haben ... das war genug, um mich ein bisschen tiefer gehen zu lassen und zu sehen, was zum Teufel los war. Habe meine Antwort oben geändert.
Kent
2
Fazit: Die BDS-Befehlssyntax ist komisch.
Ian C.
3

Von 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 (``-'').

Also brauchst du:

find . -type f -perm +0111 -print

Denken Sie daran, dass OS X BSD-basiert und nicht Linux-basiert ist. Daher sind die Gnu-Befehle, die Sie in Linux-Distributionen (von denen eine findist) gewohnt sind, nicht unbedingt dieselben wie in OS X. Dies ist nicht der Fall Ein Shell-Unterschied, es ist ein Unterschied zwischen dem Betriebssystem und den Utility-Tools des Betriebssystems.

Ian C.
quelle
1

Ich bin mir einer sehr alten Frage 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 ein Attribut als ausführbar festgelegt wird, auch wenn dieses Attribut für eine nicht ausführbare Datei festgelegt ist.

Im Lieferumfang von MacOS ist ein kleines Befehlszeilentool " file" enthalten, mit dem Dateiinformationen angezeigt werden, beispielsweise:

$> 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 wird als solche angezeigt. Da alte ausführbare 32-Bit-Dateien auch den Ausdruck "ausführbar" enthalten, sollten im Folgenden alle ausführbaren Dateien (Binärdateien) aufgeführt sein:

file * | grep "executable"

Hoffe, dass dies auch für jemanden nützlich ist, der nach einer Antwort auf dieselbe Frage sucht.

Hinweis: fileScheint keine Funktion zu haben, um durch Unterverzeichnisse zu rekursieren.

Hanzaplastique
quelle