Die Handbuchseite (oder das Online-GNU-Handbuch ) erklärt so ziemlich alles.
find -exec Befehl {} \;
Für jedes Ergebnis command {}
wird ausgeführt. Alle Vorkommen von {}
werden durch den Dateinamen ersetzt. ;
wird mit einem Schrägstrich versehen, um zu verhindern, dass die Shell ihn interpretiert.
find -exec Befehl {} +
Jedes Ergebnis wird angehängt command
und anschließend ausgeführt. Unter Berücksichtigung der Befehlslängenbeschränkungen kann dieser Befehl möglicherweise mehrmals ausgeführt werden, wobei die Handbuchseite mich unterstützt:
Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien.
Beachten Sie dieses Zitat aus der Handbuchseite:
Die Befehlszeile wird ähnlich wie xargs seine Befehlszeilen erstellt
Aus diesem Grund sind keine Zeichen zwischen {}
und +
außer Leerzeichen zulässig . +
lässt find erkennen, dass die Argumente genau wie an den Befehl angehängt werden sollen xargs
.
Die Lösung
Glücklicherweise kann die GNU-Implementierung von mv
das Zielverzeichnis als Argument mit einem -t
oder dem längeren Parameter akzeptieren --target
. Die Verwendung wird sein:
mv -t target file1 file2 ...
Ihr find
Befehl wird:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
Von der Handbuchseite:
-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 einmal für jede übereinstimmende Datei ausgeführt. Der Befehl wird im Startverzeichnis ausgeführt. Es gibt unvermeidbare Sicherheitsprobleme bei der Verwendung der Aktion -exec. Sie sollten stattdessen die Option -execdir verwenden.
-exec Befehl {} +
Diese Variante der Aktion -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.