Was ist der Unterschied zwischen '+' (plus) und ';' (Semikolon) im Befehl -exec?

28

Ich frage mich, ob der Unterschied zwischen der Verwendung +und ;dem Ende des -execBefehls bei der Verwendung im findBefehl besteht.

find .... -exec ... \; 

VS

find .... -exec ... + 
αғsнιη
quelle

Antworten:

36

-exec ... \;Läuft einen Gegenstand nach dem anderen. Wenn Sie also drei Dateien haben, wird die exec-Zeile dreimal ausgeführt.

-exec ... {} +ist für Befehle , die zu einem Zeitpunkt mehr als eine Datei nehmen (z cat, stat, ls). Die von gefundenen Dateien findwerden wie ein xargsBefehl verkettet . Dies bedeutet weniger Verzweigungen und kann bei kleinen Operationen eine erhebliche Beschleunigung bedeuten.

Hier ist eine Leistungsdemo, die 10.000 leere Dateien cattiert.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Dies funktioniert wieder nur bei Befehlen, die mehrere Dateinamen annehmen können. Sie können herausfinden, ob Ihr Befehl so ist, indem Sie sich die Manpage ansehen. Hier ist die Zusammenfassung von man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

Die Auslassungspunkte [FILE]...bedeuten, dass es mehr als eine Datei geben kann.

+kann nur für einzelne Befehle verwendet werden, und Sie müssen genau einen {}in der Zeile haben. \;kann mit mehreren Null-zu-vielen-Gruppen arbeiten.

Oli
quelle
4
Beispiel: mit \;würde der ausgeführte Befehl lauten cat 1; cat 2; cat 3. Mit +wäre der ausgeführte Befehl cat 1 2 3.
Alaa Ali
AFAIK, das +ist kein POSIX, daher möglicherweise nicht auf Nicht-Linux-Systemen verfügbar. Kein Problem, wenn Sie die Plattform nie verlassen, aber gut zu wissen, ob Sie jemals Solaris verwenden müssen. :)
Simon Richter
Oh schön, danke für die Info. Ich tippe normalerweise, -exec <command> {} ';'weil es das Tippen erleichtert (ich kann tippen, aber ich habe nicht genau die beste Technik).
Hanetzer
2
@ SimonRichter: Nein, -exec ... {} +ist POSIX. Siehe: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter Die -exec ... {} +Erweiterung wurde 2001 zur Aufnahme in POSIX-Spezifikationen vorgeschlagen und 2004 in POSIX-Ausgabe 6 ratifiziert. Möglicherweise ist die von Ihnen gewohnte Solaris-Version älter als der POSIX-Standard (oder zielt nur auf eine frühere Version ab).
Oli