Geben Sie 'man find' ein. Ich denke, '-ausführbar' ist die Option, die Sie wollen.
sje397
3
find -executable... aber dies garantiert nicht, dass jede aufgelistete Datei tatsächlich ausgeführt wird
William
1
Nicht alle Implementierungen von findsind gleich. Die von @ sje397 und @William empfohlene Option ist möglicherweise nicht verfügbar. Es ist besser, die unten gezeigte akzeptierte Lösung zu verwenden .
Ich mag alle unten gezeigten Vorschläge nicht, die auf Dateiberechtigungen basieren. Argumentation: Für mein GNU-Betriebssystem (Ubuntu) ist es möglich, das Flag "x" (ausführbare Datei) für beispielsweise eine ASCII-Textdatei zu setzen. Keine Nachahmung verhinderte den erfolgreichen Abschluss dieses Vorgangs. Es ist nur ein kleiner Fehler erforderlich, damit mehrere nicht beabsichtigte Dateien das x-Flag erhalten. Daher sind die Lösungen von gniourf_gniourf mein persönlicher Favorit. Es hat jedoch den Nachteil, dass für crosskompilierte ausführbare Dateien ein Emulator oder ein Zielgerät erforderlich ist.
Na13-c
Antworten:
173
Auf GNU-Versionen von find können Sie Folgendes verwenden -executable:
find .-type f -executable -print
Für BSD - Versionen finden, können Sie -permmit +und ein Oktal - Maske:
find .-type f -perm +111-print
In diesem Zusammenhang bedeutet "+" "jedes dieser Bits ist gesetzt" und 111 sind die Ausführungsbits.
Beachten Sie, dass dies nicht mit dem -executablePrädikat in GNU find identisch ist . Insbesondere wird -executablegetestet, ob die Datei vom aktuellen Benutzer ausgeführt werden kann, während -perm +111nur getestet wird, ob Ausführungsberechtigungen festgelegt sind.
Ältere Versionen von GNU find unterstützen ebenfalls die -perm +111Syntax, aber ab 4.5.12 wird diese Syntax nicht mehr unterstützt. Stattdessen können Sie -perm /111dieses Verhalten verwenden , um es zu erhalten.
@sourcejedi Danke. Ich habe eigentlich nur über Nicht-GNU-Versionen von find (insbesondere BSD) gesprochen, aber ältere Versionen von GNU find haben diese Syntax auch unterstützt. In neueren Versionen müssen Sie /anstelle von verwenden +. Weitere Informationen finden Sie in der aktualisierten Antwort.
Laurence Gonsalves
In der Tat habe ich Ihre Antwort falsch verstanden. Tut mir leid, dass ich es komplizierter gemacht habe :).
Sourcejedi
Wenn auch Symlinks zu ausführbaren Dateien gefunden werden sollen, fügen Sie die -LOption hinzu : find -L ....
mklement0
Es dauerte eine Weile , um die Auswirkungen von „nicht identisch mit dem -executable Prädikat“ und „just - Tests , wenn zu verstehen , alle Ausführungsrechte gesetzt sind“: Es bedeutet , dass -perm +111Ausbeute kann Fehlalarme , also Dateien , dass der aktuelle Benutzer nicht tatsächlich ausführen. Es gibt keine Möglichkeit, -executabledurch Testen von Berechtigungen allein zu emulieren , da lediglich die Benutzer- und Gruppenidentität der Datei mit der des aktuellen Benutzers in Beziehung gesetzt werden muss .
Diese Antwort versucht, einen Überblick über die vorhandenen Antworten zu geben und ihre Feinheiten und relativen Vorzüge zu diskutieren sowie Hintergrundinformationen bereitzustellen , insbesondere in Bezug auf die Portabilität .
Das Suchen von Dateien, die ausführbar sind, kann sich auf zwei unterschiedliche Anwendungsfälle beziehen :
user-centric : Finden Sie Dateien, die ausführbare Datei vom aktuellen Benutzer .
dateizentriert : Suchen Sie nach Dateien, für die (ein oder mehrere) ausführbare Berechtigungsbits gesetzt sind .
Beachten Sie, dass in beide es Szenario kann sinnvoll sein zu verwendenfind -L ... , anstatt nur find ...zu , um auch zu finden Symlinks zu ausführbaren Dateien .
Beachten Sie, dass der einfachste dateizentrierte Fall - das Suchen nach ausführbaren Dateien mit dem für ALLE drei Sicherheitsprinzipale (Benutzer, Gruppe, andere) gesetzten ausführbaren Berechtigungsbit - normalerweise , aber nicht unbedingt die gleichen Ergebnisse liefert wie das benutzerzentrierte Szenario - und das ist es wichtig, um den Unterschied zu verstehen.
Benutzerzentriert ( -executable)
Die akzeptierte Antwort empfiehlt lobenswerterweise -executable, WENN GNUfind verfügbar ist.
GNU findwird mit den meisten Linux-Distributionen geliefert
Im Gegensatz dazu verfügen BSD-basierte Plattformen, einschließlich macOS, über BSD find, das weniger leistungsfähig ist.
Entspricht je nach Szenario -executablenur den Dateien, die der aktuelle Benutzer ausführen kann (es gibt Randfälle. [1] ).
Die BSDfind - Alternative durch die akzeptierte Antwort angeboten ( -perm +111) beantwortet eine andere , Datei -centric Frage (wie die Antwort selbst erklärt).
Es ist unmöglich-perm , nur die benutzerzentrierte Frage zu beantworten , da die Benutzer- und Gruppenidentität der Datei mit der des aktuellen Benutzers in Beziehung gesetzt werden muss , während nur die Berechtigungen der Datei getestet werden können .
Wenn nur POSIX- Funktionen verwendet werden , kann die Frage nicht ohne externe Dienstprogramme beantwortet werden.-perm find
So das Beste -permtun kann (selbst) ist eine Annäherung an -executable. Vielleicht eine engere Annäherung als es -perm +111ist-perm -111 , um Dateien zu finden, bei denen das ausführbare Bit für ALLE Sicherheitsprinzipale (Benutzer, Gruppe, andere) gesetzt ist - dies scheint mir das typische reale Szenario zu sein. Als Bonus ist es auch POSIX-kompatibel ( find -Lzum Einschließen von Symlinks, siehe unten für eine Erklärung):
find .-type f -perm -111# or: find . -type f -perm -a=x
Die Antwort von gniourf_gniourf bietet ein echtes, portables Äquivalent zur-executable Verwendung-exec test -x {} \;, wenn auch auf Kosten der Leistung .
Die Kombination-exec test -x {} \; mit -perm +111(dh Dateien mit mindestens einem ausführbaren Bit-Satz) kann dazu beitragen, dass die Leistung execnicht für jede Datei aufgerufen werden muss (im Folgenden wird das POSIX-kompatible Äquivalent von BSD find -perm +111/ GNU find verwendet -perm /111; eine Erklärung finden Sie weiter unten). ::
find .-type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Dateizentrisch ( -perm)
Zur Beantwortung Datei -centric Fragen , es ist ausreichend , um die POSIX-konform zu verwenden -permprimären (bekannt als ein Test in GNU find Terminologie).
-permMit dieser Option können Sie alle Dateiberechtigungen testen , nicht nur die Ausführbarkeit.
Berechtigungen werden entweder als oktaler oder als symbolischer Modus angegeben . Oktalmodi sind Oktalzahlen (z. B. 111), während symbolische Modi Zeichenfolgen (z a=x. B. ) sind.
Symbolische Modi identifizieren die Sicherheitsprinzipale als u(Benutzer), g(Gruppe) und o(andere) oder abeziehen sich auf alle drei. Berechtigungen werden wie folgt ausgedrückt xfür ausführbare, zum Beispiel, und übertrugen an Principals Operatoren =, +und -; Eine vollständige Beschreibung, einschließlich der Oktalmodi, finden Sie in der POSIX-Spezifikation des chmodDienstprogramms .
Im Zusammenhang mit find:
Das Präfixieren eines Modus mit- (z. B. -ug=x) bedeutet: Übereinstimmungsdateien mit allen angegebenen Berechtigungen (übereinstimmende Dateien können jedoch zusätzliche Berechtigungen haben).
Mit NO Präfix (zB 755) bedeutet: Match - Dateien , die diese haben volle, genaue Menge von Berechtigungen.
Vorsichtsmaßnahme : Sowohl die GNU-Suche als auch die BSD-Suche implementieren ein zusätzliches, nicht standardmäßiges Präfix mit der Logik , dass die angegebenen Berechtigungsbits gesetzt sind, dies jedoch mit inkompatibler Syntax :
BSD finden: +
GNU finden: /[2]
Daher vermeidet diese Erweiterungen, wenn Ihr Code sein muss tragbar .
Die folgenden Beispiele zeigen tragbare Antworten auf verschiedene dateizentrierte Fragen.
Beispiele für dateizentrierte Befehle
Hinweis:
Die folgenden Beispiele sind POSIX-kompatibel , dh sie sollten in jeder POSIX-kompatiblen Implementierung funktionieren, einschließlich GNU-Suche und BSD-Suche. Dies erfordert insbesondere:
NICHT mit nicht standardmäßigen Moduspräfixen +oder /.
Verwenden der POSIX-Formulare der Primäroperationen für logische Operatoren :
!für NOT (GNU find und BSD find erlauben ebenfalls -not); Beachten Sie, dass dies \!in den Beispielen verwendet wird, um !vor Erweiterungen des Shell-Verlaufs zu schützen
-afür AND (GNU find und BSD find erlauben auch -and)
-ofür OR (GNU find und BSD find erlauben auch -or)
Die Beispiele verwenden symbolische Modi, da sie leichter zu lesen und zu merken sind.
Mit Mode - Präfix -, die =und +können die Betreiber untereinander ausgetauscht werden (zB -u=xentspricht -u+x- es sei denn , Sie gelten -xspäter, aber es gibt keinen Punkt in tun das).
Verwenden Sie ,diese Option , um Teilmodi zu verbinden. UND-Logik ist impliziert; Dies -u=x,g=xbedeutet beispielsweise, dass sowohl der Benutzer als auch das ausführbare Gruppenbit gesetzt werden müssen.
Modi können selbst keine negative Übereinstimmung im Sinne von "Übereinstimmung nur, wenn dieses Bit NICHT gesetzt ist" ausdrücken. Sie müssen einen separaten -permAusdruck mit dem NOT-Primärcode verwenden !.
Beachten Sie, dass die Primärdaten von find (wie -printoder oder -permauch als Aktionen und Tests in GNU find bezeichnet) implizit mit -a(logisches UND) verknüpft sind und dass -ound möglicherweise Klammern (als \(und \)für die Shell maskiert) erforderlich sind, um die ODER-Logik zu implementieren.
find -L ...statt nur find ...wird verwendet, um auch Symlinks mit ausführbaren Dateien
abzugleichen
-Lweist find an, die Ziele von Symlinks anstelle der Symlinks selbst zu bewerten ; also ohne -L, -type fwürde ignorieren ganz Symlinks.
# Match files that have ALL executable bits set - for ALL 3 security# principals (u (user), g (group), o (others)) and are therefore executable# by *anyone*.# This is the typical case, and applies to executables in _system_ locations# (e.g., /bin) and user-installed executables in _shared_ locations# (e.g., /usr/local/bin), for instance.
find -L .-type f -perm -a=x # -a=x is the same as -ugo=x# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:# Match files that have ANY executable bit set.# Note the need to group the permission tests using parentheses.
find -L .-type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial# mode (comma-separated clauses) and negation:# Match files that have _both_ the user and group executable bit set, while# also _not_ having the other executable bit set.
find -L .-type f -perm -u=x,g=x \! -perm -o=x
[1] Beschreibung von -executableab man findGNU-Fund 4.4.2:
Entspricht ausführbaren Dateien und durchsuchbaren Verzeichnissen (im Sinne der Auflösung von Dateinamen). Dies berücksichtigt Zugriffssteuerungslisten und andere Berechtigungsartefakte, die vom -perm-Test ignoriert werden. Dieser Test verwendet den Systemaufruf access (2) und kann daher von NFS-Servern getäuscht werden, die UID-Mapping (oder Root-Squashing) durchführen, da viele Systeme den Zugriff (2) im Kernel des Clients implementieren und daher nicht verwenden können die auf dem Server gespeicherten UID-Zuordnungsinformationen. Da dieser Test nur auf dem Ergebnis des Systemaufrufs access (2) basiert, kann nicht garantiert werden, dass eine Datei, für die dieser Test erfolgreich ist, tatsächlich ausgeführt werden kann.
[2] GNU-Find-Versionen, die älter als 4.5.12 sind, erlaubten ebenfalls ein Präfix +, das jedoch zuerst veraltet und schließlich entfernt wurde, da die Kombination +mit symbolischen Modi wahrscheinlich zu unerwarteten Ergebnissen führt, da sie als exakte Berechtigungsmaske interpretiert werden . Wenn Sie (a) laufen auf einer Version vor 4.5.12 und (b) sich beschränken Oktal nur Modi, Sie könnten mit der Verwendung weg +mit beiden GNU finden und BSD finden, aber es ist keine gute Idee.
@andynormancx :) Nun, in Bezug auf die Anzahl der Aufzählungspunkte kann ich diesen Anwärter anbieten .
mklement0
11
Um eine andere Möglichkeit zu haben 1 , die Dateien zu finden, die vom aktuellen Benutzer ausgeführt werden können:
find .-type f -exec test -x {} \; -print
(Der /usr/bin/testTestbefehl hier ist der in PATH gefundene, sehr wahrscheinlich nicht der eingebaute).
1 Verwenden Sie diese Option nur, wenn die -executableFlagge von findnicht verfügbar ist! Dies unterscheidet sich geringfügig von der -perm +111Lösung.
Das funktioniert, ist aber ziemlich langsam. Abhängig von der Shell müssen Sie möglicherweise auch den Platzhalter für Dateinamen wie '{}'oder umschließen \{\}.
Ionoclast Brigham
1
@ mklement0 Dies findet nicht die Befehle, die von mir ausgeführt werden können, wie es -executabletut oder wie mein Befehl tut.
gniourf_gniourf
1
Danke, @gniourf_gniourf - ich hatte dort wirklich ein paar Missverständnisse. Ich drucke Ihren anderen Kommentar hier nach, weil ich zumindest vorerst meine Antwort lösche (vielleicht um wiederbelebt zu werden, WENN es etwas Heilbares gibt): " find . -type f -perm -u=xist nicht das Äquivalent von -executable: -executablestimmt mit allen Dateien überein, die der Benutzer ausführen kann, und dazu gehören g+xWenn ich in der richtigen Gruppe bin oder o+x. Tatsächlich -perm -u=xwerden viele Dateien gefunden, die der Benutzer nicht ausführen kann, und einige verpassen, die der Benutzer ausführen kann. "
mklement0
1
@IonoclastBrigham: Während das {}Zitieren eine hypothetische Notwendigkeit ist (und das Zitieren nicht weh tut), ist es in der Praxis in POSIX-ähnlichen Shells und nicht erforderlich csh. Wissen Sie , Schalen , wo es ist erforderlich?
mklement0
4
@ IonoclastBrigham: Interessant, danke; in dem so ist , fish, {}muss in der Tat entweder entwertet werden '{}'oder \{\}. Beachten Sie, dass bash, kshund zshbieten Sie die gleiche Art der Klammererweiterung; jedoch drucken sie den nicht notierten Token {}wie (und damit: keine Notwendigkeit zu entkommen), weil sie eine nicht berücksichtigen gültige Klammer Ausdruck (sie benötigen mindestens 2 Token oder eine gültige Zahlenfolge Ausdruck), während fish davon ausgeht , {}eine gültige Klammer Ausdruck, der zur leeren Zeichenfolge führt.
mklement0
9
Sie können das -executableTestflag verwenden:
-executable
Matches files which are executable and directories which are
searchable (in a file name resolution sense).
Wäre das eine GNU Find-Erweiterung? Da das Tag Unix und nicht Linux ist, muss zumindest eine GNU-Erweiterung als solche dokumentiert werden.
Jonathan Leffler
3
Diese Option wird vom BSD-Befehl find nicht unterstützt, der zumindest unter OS X gefunden wurde. Dies ist eine GNU-Erweiterung, wird jedoch möglicherweise von anderen Suchvarianten unterstützt.
Ionoclast Brigham
FWIW, ich fand das nicht auf Sles 10, sondern auf Sles> = 11 (wurde ein wenig verbrannt)
Peter Turner
Beachten Sie, dass dies nicht alle Beispiele enthält. In meinem Fall hatte ich eine Datei , die ich als Besitz -rw-r-xr-xwelche -executablenicht erkennen
Dezza
2
Das hat bei mir funktioniert und ich dachte daran zu teilen ...
find ./-type f -name "*"-not -name "*.o"-exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
@ Daniel Alder, welche Version von find verwendest du? Ich habe die Option -mime in find (GNU findutils) nicht gefunden. 4.4.2
AjayKumarBasuthkar
@tripleee +1. Die Verwendung von 'file' & / 'mimetype' ist eine gute Idee oder es ist besser, eine Version zu finden, die -mime unterstützt. Sie fragen sich auch, ob 'file' / 'mimetype' die Option haben, nur ausführbare Dateien zu filtern und anzuzeigen.
AjayKumarBasuthkar
2
find .-executable -type f
garantiert nicht wirklich, dass die Datei ausführbar ist, sondern findet Dateien mit gesetztem Ausführungsbit. Wenn Sie tun
chmod a+x image.jpg
Der obige Fund wird denken, dass image.jpg eine ausführbare Datei ist, selbst wenn es sich wirklich um ein JPEG-Image handelt, bei dem das Ausführungsbit gesetzt ist.
Im Allgemeinen arbeite ich damit um das Problem herum:
Im obigen Beispiel befindet sich der vollständige Pfadname der Datei im letzten Feld und muss angeben, wo Sie mit awk "NAME = $ (awk '{print $ NF}' <<< $ LINE)" suchen, wenn sich der Dateiname an einer anderen Stelle befand Die Suchausgabezeichenfolge, die Sie benötigen, um "NF" durch die richtige numerische Position zu ersetzen. Wenn Ihr Trennzeichen kein Leerzeichen ist, müssen Sie awk auch mitteilen, was Ihr Trennzeichen ist.
Es ist so lächerlich, dass dies nicht ganz einfach ist ... geschweige denn so gut wie unmöglich . Hände hoch, ich verlasse mich auf Apple / Spotlight ...
Gut zu wissen mdfindunter OSX. Beachten Sie, dass Ihr Befehl ausführbare Unix-Dateien für das gesamte System meldet . mdfind -onlyin . 'kMDItemContentType=public.unix-executable'begrenzt die Ergebnisse auf den Teilbaum des aktuellen Verzeichnisses. Kleinere Punkte von Interesse: Die Beschränkung der Suche auf ein bestimmtes Verzeichnis (ohne Unterordner) wird anscheinend nicht unterstützt. Symlinks zu ausführbaren Dateien sind anscheinend nie enthalten. Seltsamerweise wird das mdfindanschließende Entfernen des ausführbaren Bits nicht erfasst, sobald festgestellt wurde, dass eine Datei ausführbar ist .
mklement0
Ich glaube, ich habe Fehler darin gefunden, wie Spotlight ausführbare Unix-Dateien erkennt / nicht erkennt. Ich habe einen Fehler bei Apple und auch bei openradar.me/20162683 eingereicht . Ich ermutige Sie - und alle anderen, die an dieser Funktionalität interessiert sind -, auch einen Fehler bei bugreport.apple.com einzureichen
mklement0
(Entschuldigung für die Unruhe in den Kommentaren; hoffentlich sind sie jetzt korrekt) mdfind -onlyin . 'kMDItemContentType=public.unix-executable'verhält sich wie find . -type f -perm +111 -printfolgt. Das heißt, es werden Dateien mit einem gesetzten ausführbaren Bit gefunden, was zu falsch positiven Ergebnissen führen kann (obwohl dies in der Praxis möglicherweise kein Problem darstellt). Um wirklich nur Dateien zu finden, die vom aktuellen Benutzer mithilfe von BSD find ausgeführt werden können, lesen Sie die Antwort von @ gniourf_gniourf. Die Verwendung einer findbasierten Lösung hat den Vorteil, dass Sie auf Wunsch auch Symlinks zu ausführbaren Dateien finden können (Option -L), was mdfindanscheinend nicht möglich ist.
mklement0
1
@ mklement0 Meine Antwort verzichtete auf Verzierungen - um zu versuchen, den Punkt nach Hause zu bringen - aber ja, Sie würden diese Form fast nie "ungarnished" verwenden. Eine andere Option - nicht sicher, ob sie auftaucht - ist gutes altes Globbing .. ls /Applications/**/*(*)in Ihrer (meiner?) zshShell
Alex Gray
Danke für den praktischen zshTipp - wusste das nicht; (Anscheinend können Sie entweder ausführbare Dateien ( *) oder symlinks ( @) abgleichen , aber nicht beide, oder?). Was Ihren ursprünglichen Punkt betrifft : Lassen Sie mich noch einmal wiederholen: Er find . -type f -perm +a=xwird das tun, was Ihr mdfindBefehl tut, und gleichzeitig mehr Flexibilität bieten. Sie können es sogar so umformulieren, dass es POSIX-kompatibel ist.
mklement0
1
Die einfache Antwort wäre: "Ihre ausführbaren Dateien befinden sich in den Verzeichnissen, die in Ihrer PATH-Variablen enthalten sind", aber das würde Ihre ausführbaren Dateien nicht wirklich finden und könnte sowieso viele ausführbare Dateien übersehen.
Ich weiß nicht viel über Mac, aber ich denke, dass "mdfind 'kMDItemContentType = public.unix-ausführbare Datei" Dinge wie interpretierte Skripte vermissen könnte
Wenn es für Sie in Ordnung ist, Dateien mit gesetzten ausführbaren Bits zu finden (unabhängig davon, ob sie tatsächlich ausführbar sind), ist dies in Ordnung
find .-type f -perm +111-print
Wenn dies unterstützt wird, wird mit der Option "-executable" ein weiterer Filter erstellt, der sich mit acl und anderen Berechtigungsartefakten befasst, unterscheidet sich jedoch technisch nicht wesentlich von "-pemr +111".
Vielleicht wird find in Zukunft "-magic" unterstützen und Sie können explizit nach Dateien mit einer bestimmten magischen ID suchen ... aber dann müssten Sie angeben, um alle magischen IDs der ausführbaren Formate zu optimieren.
Mir ist kein technisch korrekter einfacher Ausweg unter Unix bekannt.
Also , wenn Sie tatsächlich ausführbare Dateitypen finden möchten (zB Skripte, ELF - Binaries etc .. etc ..) nicht nur Dateien mit der Ausführung Erlaubnis dann möchten Sie wahrscheinlich etwas mehr wie dies tun (wo das aktuelle Verzeichnis. Mit was auch immer ersetzt werden Verzeichnis, das Sie wollen):
Wenn Sie unter OS X arbeiten, ist ein kleines Dienstprogramm namens is_exec enthalten, das diesen kleinen Test für Sie bündelt, sodass Sie die Befehlszeile verkürzen können, wenn Sie ihn finden. Diese Methode ist jedoch flexibler, da Sie den == -Test leicht durch den = ~ -Test ersetzen und damit nach komplexeren Eigenschaften wie ausführbaren Nur-Text-Dateien oder anderen Informationen suchen können, die Ihr Dateibefehl zurückgibt.
Die genauen Regeln für das Zitieren hier sind ziemlich undurchsichtig, so dass ich es am Ende nur durch Ausprobieren ausarbeite, aber ich würde gerne die richtige Erklärung hören.
Ich hatte das gleiche Problem und die Antwort war im Quellmenü des Menüs : das zu diesem Zweck erstellte Dienstprogramm stest. Sie können die Dateien 'stest.c' und 'arg.h' kompilieren und es sollte funktionieren. Es gibt eine Manpage für die Verwendung, die ich der Einfachheit halber dort abgelegt habe:
STEST(1)GeneralCommandsManual STEST(1)
NAME
stest - filter a list of files by properties
SYNOPSIS
stest [-abcdefghlpqrsuwx][-n file][-o file][file...]
DESCRIPTION
stest takes a list of files and filters by the
files' properties, analogous to test(1). Files
which pass all tests are printed to stdout. If no
files are given, stest reads files from stdin.
OPTIONS
-a Test hidden files.
-b Test that files are block specials.
-c Test that files are character specials.
-d Test that files are directories.
-e Test that files exist.
-f Test that files are regular files.
-g Test that files have their set-group-ID
flag set.
-h Test that files are symbolic links.
-l Test the contents of a directory given as
an argument.
-n file
Test that files are newer than file.
-o file
Test that files are older than file.
-p Test that files are named pipes.
-q No files are printed, only the exit status
is returned.
-r Test that files are readable.
-s Test that files are not empty.
-u Test that files have their set-user-ID flag
set.
-v Invert the sense of tests, only failing
files pass.
-w Test that files are writable.
-x Test that files are executable.
EXIT STATUS
0 At least one file passed all tests.
1 No files passed all tests.
2 An error occurred.
SEE ALSO
dmenu(1), test(1)
dmenu-4.6 STEST(1)
find -executable
... aber dies garantiert nicht, dass jede aufgelistete Datei tatsächlich ausgeführt wirdfind
sind gleich. Die von @ sje397 und @William empfohlene Option ist möglicherweise nicht verfügbar. Es ist besser, die unten gezeigte akzeptierte Lösung zu verwenden .Antworten:
Auf GNU-Versionen von find können Sie Folgendes verwenden
-executable
:Für BSD - Versionen finden, können Sie
-perm
mit+
und ein Oktal - Maske:In diesem Zusammenhang bedeutet "+" "jedes dieser Bits ist gesetzt" und 111 sind die Ausführungsbits.
Beachten Sie, dass dies nicht mit dem
-executable
Prädikat in GNU find identisch ist . Insbesondere wird-executable
getestet, ob die Datei vom aktuellen Benutzer ausgeführt werden kann, während-perm +111
nur getestet wird, ob Ausführungsberechtigungen festgelegt sind.Ältere Versionen von GNU find unterstützen ebenfalls die
-perm +111
Syntax, aber ab 4.5.12 wird diese Syntax nicht mehr unterstützt. Stattdessen können Sie-perm /111
dieses Verhalten verwenden , um es zu erhalten.quelle
find: invalid mode ‘+111’
bei findutils 4.5.11 4.fc20./
anstelle von verwenden+
. Weitere Informationen finden Sie in der aktualisierten Antwort.-L
Option hinzu :find -L ...
.-perm +111
Ausbeute kann Fehlalarme , also Dateien , dass der aktuelle Benutzer nicht tatsächlich ausführen. Es gibt keine Möglichkeit,-executable
durch Testen von Berechtigungen allein zu emulieren , da lediglich die Benutzer- und Gruppenidentität der Datei mit der des aktuellen Benutzers in Beziehung gesetzt werden muss .Tipp des Hutes an @ gniourf_gniourf, um ein grundlegendes Missverständnis auszuräumen .
Diese Antwort versucht, einen Überblick über die vorhandenen Antworten zu geben und ihre Feinheiten und relativen Vorzüge zu diskutieren sowie Hintergrundinformationen bereitzustellen , insbesondere in Bezug auf die Portabilität .
Das Suchen von Dateien, die ausführbar sind, kann sich auf zwei unterschiedliche Anwendungsfälle beziehen :
Beachten Sie, dass in beide es Szenario kann sinnvoll sein zu verwenden
find -L ...
, anstatt nurfind ...
zu , um auch zu finden Symlinks zu ausführbaren Dateien .Beachten Sie, dass der einfachste dateizentrierte Fall - das Suchen nach ausführbaren Dateien mit dem für ALLE drei Sicherheitsprinzipale (Benutzer, Gruppe, andere) gesetzten ausführbaren Berechtigungsbit - normalerweise , aber nicht unbedingt die gleichen Ergebnisse liefert wie das benutzerzentrierte Szenario - und das ist es wichtig, um den Unterschied zu verstehen.
Benutzerzentriert (
-executable
)Die akzeptierte Antwort empfiehlt lobenswerterweise
-executable
, WENN GNUfind
verfügbar ist.find
wird mit den meisten Linux-Distributionen geliefert-executable
nur den Dateien, die der aktuelle Benutzer ausführen kann (es gibt Randfälle. [1] ).Die BSD
find
- Alternative durch die akzeptierte Antwort angeboten (-perm +111
) beantwortet eine andere , Datei -centric Frage (wie die Antwort selbst erklärt).-perm
, nur die benutzerzentrierte Frage zu beantworten , da die Benutzer- und Gruppenidentität der Datei mit der des aktuellen Benutzers in Beziehung gesetzt werden muss , während nur die Berechtigungen der Datei getestet werden können . Wenn nur POSIX- Funktionen verwendet werden , kann die Frage nicht ohne externe Dienstprogramme beantwortet werden.-perm
find
So das Beste
-perm
tun kann (selbst) ist eine Annäherung an-executable
. Vielleicht eine engere Annäherung als es-perm +111
ist-perm -111
, um Dateien zu finden, bei denen das ausführbare Bit für ALLE Sicherheitsprinzipale (Benutzer, Gruppe, andere) gesetzt ist - dies scheint mir das typische reale Szenario zu sein. Als Bonus ist es auch POSIX-kompatibel (find -L
zum Einschließen von Symlinks, siehe unten für eine Erklärung):Die Antwort von gniourf_gniourf bietet ein echtes, portables Äquivalent zur
-executable
Verwendung-exec test -x {} \;
, wenn auch auf Kosten der Leistung .Die Kombination
-exec test -x {} \;
mit-perm +111
(dh Dateien mit mindestens einem ausführbaren Bit-Satz) kann dazu beitragen, dass die Leistungexec
nicht für jede Datei aufgerufen werden muss (im Folgenden wird das POSIX-kompatible Äquivalent von BSD find-perm +111
/ GNU find verwendet-perm /111
; eine Erklärung finden Sie weiter unten). ::Dateizentrisch (
-perm
)-perm
primären (bekannt als ein Test in GNU find Terminologie).-perm
Mit dieser Option können Sie alle Dateiberechtigungen testen , nicht nur die Ausführbarkeit.111
), während symbolische Modi Zeichenfolgen (za=x
. B. ) sind.u
(Benutzer),g
(Gruppe) undo
(andere) odera
beziehen sich auf alle drei. Berechtigungen werden wie folgt ausgedrücktx
für ausführbare, zum Beispiel, und übertrugen an Principals Operatoren=
,+
und-
; Eine vollständige Beschreibung, einschließlich der Oktalmodi, finden Sie in der POSIX-Spezifikation deschmod
Dienstprogramms .find
:-
(z. B.-ug=x
) bedeutet: Übereinstimmungsdateien mit allen angegebenen Berechtigungen (übereinstimmende Dateien können jedoch zusätzliche Berechtigungen haben).755
) bedeutet: Match - Dateien , die diese haben volle, genaue Menge von Berechtigungen.+
/
[2]Beispiele für dateizentrierte Befehle
Hinweis:
+
oder/
.!
für NOT (GNU find und BSD find erlauben ebenfalls-not
); Beachten Sie, dass dies\!
in den Beispielen verwendet wird, um!
vor Erweiterungen des Shell-Verlaufs zu schützen-a
für AND (GNU find und BSD find erlauben auch-and
)-o
für OR (GNU find und BSD find erlauben auch-or
)-
, die=
und+
können die Betreiber untereinander ausgetauscht werden (zB-u=x
entspricht-u+x
- es sei denn , Sie gelten-x
später, aber es gibt keinen Punkt in tun das).,
diese Option , um Teilmodi zu verbinden. UND-Logik ist impliziert; Dies-u=x,g=x
bedeutet beispielsweise, dass sowohl der Benutzer als auch das ausführbare Gruppenbit gesetzt werden müssen.-perm
Ausdruck mit dem NOT-Primärcode verwenden!
.-print
oder oder-perm
auch als Aktionen und Tests in GNU find bezeichnet) implizit mit-a
(logisches UND) verknüpft sind und dass-o
und möglicherweise Klammern (als\(
und\)
für die Shell maskiert) erforderlich sind, um die ODER-Logik zu implementieren.find -L ...
statt nurfind ...
wird verwendet, um auch Symlinks mit ausführbaren Dateien abzugleichen-L
weist find an, die Ziele von Symlinks anstelle der Symlinks selbst zu bewerten ; also ohne-L
,-type f
würde ignorieren ganz Symlinks.[1] Beschreibung von
-executable
abman find
GNU-Fund 4.4.2:[2] GNU-Find-Versionen, die älter als 4.5.12 sind, erlaubten ebenfalls ein Präfix
+
, das jedoch zuerst veraltet und schließlich entfernt wurde, da die Kombination+
mit symbolischen Modi wahrscheinlich zu unerwarteten Ergebnissen führt, da sie als exakte Berechtigungsmaske interpretiert werden . Wenn Sie (a) laufen auf einer Version vor 4.5.12 und (b) sich beschränken Oktal nur Modi, Sie könnten mit der Verwendung weg+
mit beiden GNU finden und BSD finden, aber es ist keine gute Idee.quelle
Um eine andere Möglichkeit zu haben 1 , die Dateien zu finden, die vom aktuellen Benutzer ausgeführt werden können:
(Der
/usr/bin/test
Testbefehl hier ist der in PATH gefundene, sehr wahrscheinlich nicht der eingebaute).1 Verwenden Sie diese Option nur, wenn die
-executable
Flagge vonfind
nicht verfügbar ist! Dies unterscheidet sich geringfügig von der-perm +111
Lösung.quelle
'{}'
oder umschließen\{\}
.-executable
tut oder wie mein Befehl tut.find . -type f -perm -u=x
ist nicht das Äquivalent von-executable
:-executable
stimmt mit allen Dateien überein, die der Benutzer ausführen kann, und dazu gehöreng+x
Wenn ich in der richtigen Gruppe bin odero+x
. Tatsächlich-perm -u=x
werden viele Dateien gefunden, die der Benutzer nicht ausführen kann, und einige verpassen, die der Benutzer ausführen kann. "{}
Zitieren eine hypothetische Notwendigkeit ist (und das Zitieren nicht weh tut), ist es in der Praxis in POSIX-ähnlichen Shells und nicht erforderlichcsh
. Wissen Sie , Schalen , wo es ist erforderlich?fish
,{}
muss in der Tat entweder entwertet werden'{}'
oder\{\}
. Beachten Sie, dassbash
,ksh
undzsh
bieten Sie die gleiche Art der Klammererweiterung; jedoch drucken sie den nicht notierten Token{}
wie (und damit: keine Notwendigkeit zu entkommen), weil sie eine nicht berücksichtigen gültige Klammer Ausdruck (sie benötigen mindestens 2 Token oder eine gültige Zahlenfolge Ausdruck), währendfish
davon ausgeht ,{}
eine gültige Klammer Ausdruck, der zur leeren Zeichenfolge führt.Sie können das
-executable
Testflag verwenden:quelle
-rw-r-xr-x
welche-executable
nicht erkennenDas hat bei mir funktioniert und ich dachte daran zu teilen ...
quelle
file
!find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
garantiert nicht wirklich, dass die Datei ausführbar ist, sondern findet Dateien mit gesetztem Ausführungsbit. Wenn Sie tun
Der obige Fund wird denken, dass image.jpg eine ausführbare Datei ist, selbst wenn es sich wirklich um ein JPEG-Image handelt, bei dem das Ausführungsbit gesetzt ist.
Im Allgemeinen arbeite ich damit um das Problem herum:
Wenn Sie möchten, dass der Fund tatsächlich Dome-Informationen zu ausführbaren Dateien druckt, können Sie Folgendes tun:
Im obigen Beispiel befindet sich der vollständige Pfadname der Datei im letzten Feld und muss angeben, wo Sie mit awk "NAME = $ (awk '{print $ NF}' <<< $ LINE)" suchen, wenn sich der Dateiname an einer anderen Stelle befand Die Suchausgabezeichenfolge, die Sie benötigen, um "NF" durch die richtige numerische Position zu ersetzen. Wenn Ihr Trennzeichen kein Leerzeichen ist, müssen Sie awk auch mitteilen, was Ihr Trennzeichen ist.
quelle
Es ist so lächerlich, dass dies nicht ganz einfach ist ... geschweige denn so gut wie unmöglich . Hände hoch, ich verlasse mich auf Apple / Spotlight ...
mdfind 'kMDItemContentType=public.unix-executable'
Zumindest funktioniert es!
quelle
mdfind
unter OSX. Beachten Sie, dass Ihr Befehl ausführbare Unix-Dateien für das gesamte System meldet .mdfind -onlyin . 'kMDItemContentType=public.unix-executable'
begrenzt die Ergebnisse auf den Teilbaum des aktuellen Verzeichnisses. Kleinere Punkte von Interesse: Die Beschränkung der Suche auf ein bestimmtes Verzeichnis (ohne Unterordner) wird anscheinend nicht unterstützt. Symlinks zu ausführbaren Dateien sind anscheinend nie enthalten. Seltsamerweise wird dasmdfind
anschließende Entfernen des ausführbaren Bits nicht erfasst, sobald festgestellt wurde, dass eine Datei ausführbar ist .mdfind -onlyin . 'kMDItemContentType=public.unix-executable'
verhält sich wiefind . -type f -perm +111 -print
folgt. Das heißt, es werden Dateien mit einem gesetzten ausführbaren Bit gefunden, was zu falsch positiven Ergebnissen führen kann (obwohl dies in der Praxis möglicherweise kein Problem darstellt). Um wirklich nur Dateien zu finden, die vom aktuellen Benutzer mithilfe von BSD find ausgeführt werden können, lesen Sie die Antwort von @ gniourf_gniourf. Die Verwendung einerfind
basierten Lösung hat den Vorteil, dass Sie auf Wunsch auch Symlinks zu ausführbaren Dateien finden können (Option-L
), wasmdfind
anscheinend nicht möglich ist.ls /Applications/**/*(*)
in Ihrer (meiner?)zsh
Shellzsh
Tipp - wusste das nicht; (Anscheinend können Sie entweder ausführbare Dateien (*
) oder symlinks (@
) abgleichen , aber nicht beide, oder?). Was Ihren ursprünglichen Punkt betrifft : Lassen Sie mich noch einmal wiederholen: Erfind . -type f -perm +a=x
wird das tun, was Ihrmdfind
Befehl tut, und gleichzeitig mehr Flexibilität bieten. Sie können es sogar so umformulieren, dass es POSIX-kompatibel ist.Die einfache Antwort wäre: "Ihre ausführbaren Dateien befinden sich in den Verzeichnissen, die in Ihrer PATH-Variablen enthalten sind", aber das würde Ihre ausführbaren Dateien nicht wirklich finden und könnte sowieso viele ausführbare Dateien übersehen.
Ich weiß nicht viel über Mac, aber ich denke, dass "mdfind 'kMDItemContentType = public.unix-ausführbare Datei" Dinge wie interpretierte Skripte vermissen könnte
Wenn es für Sie in Ordnung ist, Dateien mit gesetzten ausführbaren Bits zu finden (unabhängig davon, ob sie tatsächlich ausführbar sind), ist dies in Ordnung
Wenn dies unterstützt wird, wird mit der Option "-executable" ein weiterer Filter erstellt, der sich mit acl und anderen Berechtigungsartefakten befasst, unterscheidet sich jedoch technisch nicht wesentlich von "-pemr +111".
Vielleicht wird find in Zukunft "-magic" unterstützen und Sie können explizit nach Dateien mit einer bestimmten magischen ID suchen ... aber dann müssten Sie angeben, um alle magischen IDs der ausführbaren Formate zu optimieren.
Mir ist kein technisch korrekter einfacher Ausweg unter Unix bekannt.
quelle
Also , wenn Sie tatsächlich ausführbare Dateitypen finden möchten (zB Skripte, ELF - Binaries etc .. etc ..) nicht nur Dateien mit der Ausführung Erlaubnis dann möchten Sie wahrscheinlich etwas mehr wie dies tun (wo das aktuelle Verzeichnis. Mit was auch immer ersetzt werden Verzeichnis, das Sie wollen):
Oder für diejenigen unter Ihnen, die keine Macports verwenden (Linux-Benutzer) oder auf andere Weise gnu find installiert haben, wie Sie es möchten:
Wenn Sie unter OS X arbeiten, ist ein kleines Dienstprogramm namens is_exec enthalten, das diesen kleinen Test für Sie bündelt, sodass Sie die Befehlszeile verkürzen können, wenn Sie ihn finden. Diese Methode ist jedoch flexibler, da Sie den == -Test leicht durch den = ~ -Test ersetzen und damit nach komplexeren Eigenschaften wie ausführbaren Nur-Text-Dateien oder anderen Informationen suchen können, die Ihr Dateibefehl zurückgibt.
Die genauen Regeln für das Zitieren hier sind ziemlich undurchsichtig, so dass ich es am Ende nur durch Ausprobieren ausarbeite, aber ich würde gerne die richtige Erklärung hören.
quelle
Ich hatte das gleiche Problem und die Antwort war im Quellmenü des Menüs : das zu diesem Zweck erstellte Dienstprogramm stest. Sie können die Dateien 'stest.c' und 'arg.h' kompilieren und es sollte funktionieren. Es gibt eine Manpage für die Verwendung, die ich der Einfachheit halber dort abgelegt habe:
quelle