Diese geschweiften Klammern werden durch Bash allein gelassen; sie gehören find
und xargs
sind und werden in ihren Mann-Seiten beschrieben.
man find
-exec
Befehl ;
Befehl ausführen ; true, wenn der Status 0 zurückgegeben wird. Alle folgenden zu suchenden Argumente gelten als Argumente für den Befehl, bis ein bestehendes Argument gefunden ;
wird. Die Zeichenfolge {}
wird durch den aktuellen Dateinamen ersetzt, der überall dort verarbeitet wird, wo er in den Argumenten des Befehls vorkommt, nicht nur in Argumenten, in denen er allein ist, wie in einigen Versionen von find
. Diese beiden Konstruktionen müssen möglicherweise maskiert (mit a \
) oder in Anführungszeichen gesetzt werden, um sie vor der Expansion durch die Shell zu schützen. Im Abschnitt BEISPIELE finden Sie Beispiele für die Verwendung der -exec
Option. Der angegebene
Befehlwird einmal für jede übereinstimmende Datei ausgeführt. Der Befehl wird im Startverzeichnis ausgeführt. Es gibt unvermeidbare Sicherheitsprobleme bei der Verwendung der -exec
Aktion. Sie sollten -execdir
stattdessen die Option verwenden.
-exec
Befehl {}
+
Diese Variante der -exec
Aktion führt den angegebenen Befehl für die ausgewählten Dateien aus. Die Befehlszeile wird jedoch erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile wird ähnlich wie die xargs
Befehlszeilen erstellt. {}
Innerhalb des Befehls ist nur eine Instanz von zulässig. Der Befehl wird im Startverzeichnis ausgeführt. Wenn find
ein Fehler auftritt, kann dies manchmal zu einem sofortigen Beenden führen, sodass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden. Diese Variante von gibt -exec
immer true zurück.
-execdir
Befehl ;
-execdir
Befehl {}
+
Wie -exec
, aber der angegebene Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält. Dies ist normalerweise nicht das Verzeichnis, in dem Sie mit der Suche begonnen haben. Dies ist eine viel sicherere Methode zum Aufrufen von Befehlen, da bei der Auflösung der Pfade zu den übereinstimmenden Dateien Race-Bedingungen vermieden werden. Wie bei der -exec
Aktion erstellt die
+
Form von -execdir
eine Befehlszeile, um mehr als eine übereinstimmende Datei zu verarbeiten. Bei jedem Befehlsaufruf werden jedoch nur Dateien aufgelistet, die im selben Unterverzeichnis vorhanden sind. Wenn Sie diese Option verwenden, müssen Sie sicherstellen, dass Ihre $PATH
Umgebungsvariable nicht referenziert.
;; Andernfalls kann ein Angreifer beliebige Befehle ausführen, indem er eine Datei mit dem entsprechenden Namen in einem Verzeichnis belässt, in dem Sie ausgeführt werden -execdir
. Gleiches gilt für Einträge, $PATH
die leer oder keine absoluten Verzeichnisnamen sind. Wenn find
ein Fehler auftritt, kann dies manchmal zu einem sofortigen Beenden führen, sodass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden. Das Ergebnis der Aktion hängt davon ab, ob die +
oder die ;
Variante verwendet wird.
-execdir
Der Befehl gibt {}
+
immer true zurück, während der -execdir
Befehl {}
;
nur dann true zurückgibt, wenn der Befehl 0 zurückgibt.
man xargs
-I
ersetzen-str
Ersetzen Sie das Auftreten von replace-str in den Anfangsargumenten durch Namen, die aus der Standardeingabe gelesen wurden. Nicht zitierte Leerzeichen beenden auch keine Eingabeelemente. Stattdessen ist das Trennzeichen das Zeilenumbruchzeichen. Impliziert -x
und -L
1
.
-i
[ replace-str ], --replace
[ =
replace-str ]
Diese Option ist ein Synonym für -I
replace-str, wenn replace-str angegeben ist. Wenn das Argument replace-str fehlt, ist der Effekt der gleiche wie -I{}
. Diese Option ist veraltet. Verwenden Sie -I
stattdessen.
Edit: und hier, warum Bash diese geschweiften Klammern ignoriert:
man bash
{
aufführen;
}
list wird einfach in der aktuellen Shell-Umgebung ausgeführt. Die Liste muss mit einem Zeilenumbruch oder einem Semikolon abgeschlossen werden. Dies wird als Gruppenbefehl bezeichnet. Der Rückgabestatus ist der Beendigungsstatus der Liste. Beachten Sie, dass im Gegensatz zu den Metazeichen ( und ) , { und } reservierte Worte und muß dort auftreten , wo ein reserviertes Wort erkannt werden darf. Da sie keinen Wortumbruch verursachen, müssen sie durch Leerzeichen oder ein anderes Shell-Metazeichen von der Liste getrennt werden.
Zur Hervorhebung: Die Liste muss mit einem Zeilenumbruch oder einem Semikolon abgeschlossen werden .
{}
bedeutettargets
, dass mit demfind
Befehlrm
Dateien entfernt / gefunden werden.