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 ... + 

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.