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
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:
find
ist 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", 111
ist das Oktal für das ausführbare Bit für Besitzer, Gruppe und irgendjemand)-type f
bedeutet, dass der Typ eine Datei ist-or
boolesches ODER-type l
bedeutet, dass der Typ ein symbolischer Link istIch 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.
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 find
eine 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: file
scheint 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 bash
Ihre Lieblingsschale ersetzen.
Jan C.
-L
anstelle von verwenden-or -type l
, um allestat
Aufrufe vonfind
dazu zu veranlassen, die Statistiken der verknüpften Datei zurückzugeben, nicht den Link selbst.Ivan Xiao