Von man find
:
-exec Befehl;
Befehl ausführen; true, wenn der Status 0 zurückgegeben wird. Alle folgenden zu findenden Argumente gelten als Argumente für den Befehl, bis ein Argument aus ';' angetroffen 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 einem '\') oder in Anführungszeichen gesetzt werden, um sie vor der Erweiterung durch die Shell zu schützen. Im Abschnitt BEISPIELE finden Sie Beispiele für die Verwendung der Option '-exec'. Der angegebene Befehl wird für jede übereinstimmende Datei einmal ausgeführt.
Der Befehl wird im Startverzeichnis ausgeführt. Es gibt unvermeidbare Sicherheitsprobleme bei der Verwendung der Option -exec.
-exec Befehl {} +
Diese Variante der Option -exec 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 xargs seine Befehlszeilen erstellt. Innerhalb des Befehls ist nur eine Instanz von '{}' zulässig. Der Befehl wird im Startverzeichnis ausgeführt.
So wie ich es verstehe, \;
wird für jede gefundene Datei ein separater Befehl ausgeführt find
, während \+
die Dateien angehängt und für alle ein einziger Befehl ausgeführt wird. Das \
ist ein Fluchtcharakter, also ist es:
ls testdir1; ls testdir2
vs.
ls testdir1 testdir2
Das oben Genannte in meiner Shell zu tun, spiegelte die Ausgabe in Ihrer Frage wider.
Beispiel, wann Sie verwenden möchten \+
Angenommen, zwei Dateien 1.tmp
und 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Mit \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Wenn Sie Folgendes verwenden \+
(um die Ergebnisse von zu verketten find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
In diesem Fall ist es also der Unterschied zwischen diff 1.tmp; diff 2.tmp
unddiff 1.tmp 2.tmp
Es gibt Fälle, in denen dies \;
angemessen und \+
notwendig ist. Die Verwendung \+
mit rm
ist eine solche Instanz, bei der beim Entfernen einer großen Anzahl von Dateien die Leistung (Geschwindigkeit) überlegen ist \;
.