Was macht der Befehl + in find / path / -exec '{}' +?

13

Was ist +in find /path/ -exec command '{}' +do? im Gegensatz zufind /path/ -exec command '{}' \;

Xenoterracid
quelle

Antworten:

17

Das '+' setzt aus allen gefundenen Dateien eine große Befehlszeile, um die Anzahl der auszuführenden Befehle zu minimieren.

Vorausgesetzt, ein find-Befehl findet vier Dateien.

find . -type f -exec command '{}' \;

würde produzieren

command file1
command file2
command file3
command file4 

Auf der anderen Seite

find . -type f -exec command '{}' \+

produziert

command file1 file2 file3 file4
ddeimeke
quelle
3
Wenn Sie das wissen xargs, -exec … {} +tun Sie dasselbe wie -print | xargs …, aber ohne die Anführungszeichen ( -print0 | xargs -0ist eine andere Möglichkeit, aber weniger portabel).
Gilles 'SO- hör auf, böse zu sein'
4

Von der Manpage:

-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 ist in etwa so aufgebaut wie die Befehlszeilen von xargs. Innerhalb des Befehls ist nur eine Instanz von "{}" zulässig. Der Befehl wird im Startverzeichnis ausgeführt.

tante
quelle
1
Mann, der sehr ... knapp ist? Mir fehlt es an Tiefe und Klarheit.
Xenoterracide
Die Idee ist, nicht blindlings einen Prozess für jede Datei zu erzeugen, sondern die Dateinamen zusammenzufassen und den Befehl weniger oft aufzurufen. Ein Beispiel: Anstatt 3 verschiedene "rm FILENAME" -Prozesse zu erstellen, werden die Dateinamen gesammelt und "rm FILE1 FILE2 FILE3" ausgeführt.
Tante
IIRC Einige Versionen von Xargs bieten die Möglichkeit, diese Namen bis zu einem festgelegten Grenzwert zu stapeln. Sie können also davon profitieren, aber auch ein Überlaufen vermeiden, wenn Sie über eine große Liste verfügen.
Kevin Cantu
(Find selbst ist eine gruselige kleine Sprache für sich!)
Kevin Cantu
findgibt mir ein semi.
Matt Alexander