Die Syntax lautet:
find ... -exec cmd {} +
find
findet eine Reihe von Dateien basierend auf den Kriterien in ...
und wird cmd
mit dieser Liste von Dateipfaden als Argumente ausgeführt, so viele wie möglich, ohne die Begrenzung der Größe der Argumente für einen Befehl zu überschreiten.
Bei Bedarf kann die Liste der Dateien aufgeteilt und cmd
mehrmals aufgerufen werden . Zum Beispiel kann es dazu führen, dass Folgendes aufgerufen wird:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Eine Einschränkung dabei ist, dass {}
es zuletzt sein muss. Sie können zum Beispiel nicht schreiben:
find ... -exec cmd {} other args +
wie du könntest mit ';'
statt '+'
.
Du kannst schreiben:
find ... -exec echo foo {} +
aber nicht:
find ... -exec echo {} foo +
Wenn Sie also cmd
nach der Liste der Dateien einige zusätzliche Argumente hinzufügen müssen, müssen Sie eine Shell aufrufen. (Andere Gründe, warum Sie eine Shell aufrufen müssen, sind, wann immer Sie eine Shell-Funktion wie Umleitungen, Pipes, einige Zeichenfolgenerweiterungen verwenden müssen ...)
In sh -c 'inline-script' x a b c
, für inline-script
, $0
ist x
, $1
ist a
, $2
ist b
... so "$@"
ist die Liste dieser 3 Argumente: a, b und c. Also in:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Für den Inline - Skript , $0
(die zum Beispiel verwendet, wenn Fehlermeldungen angezeigt wird ) auf find-sh
und "$@"
ist die Liste der Dateien (was find
erweitert {}
wird).
Mit dem exec
speziellen eingebauten Shell:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Wir weisen die Shell an, keinen zusätzlichen Prozess zum Ausführen zu verzweigen cmd
, sondern ihn im selben Prozess auszuführen (indem der laufende Shell-Prozess durch diesen Befehl ersetzt wird). Einige Granaten wie bash
, zsh
und einige Implementierungen ksh
tun implizit für den letzten Befehl in einem Skript.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?find-sh {}
sind das Argumente für den Befehl sh -c '...', richtig?find
ruft/bin/sh
als Argumente auf("sh", "-c", "...", "find-sh", "./file1", "./file2"...). And inside
..., that maps (the shells maps that) to
$ 0` ist"find-sh"
, und die Positionsparameter ($1
,$2
... die man sagen könnte, sind die Argumente für das Inline-Skript ) sind./file1
,./file2
.