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 :
- 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 GNU find
verfügbar ist.
- GNU
find
wird 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
-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).
- 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 -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):
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 exec
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). ::
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
-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.
- 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 a
beziehen sich auf alle drei. Berechtigungen werden wie folgt ausgedrückt x
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 des chmod
Dienstprogramms .
- 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
-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 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=x
entspricht -u+x
- es sei denn , Sie gelten -x
spä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=x
bedeutet 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
-perm
Ausdruck mit dem NOT-Primärcode verwenden !
.
- Beachten Sie, dass die Primärdaten von find (wie
-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 nur find ...
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.
# 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 -executable
ab man find
GNU-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.