Ich frage mich, ob der Unterschied zwischen der Verwendung +
und ;
dem Ende des -exec
Befehls bei der Verwendung im find
Befehl besteht.
find .... -exec ... \;
VS
find .... -exec ... +
-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 find
werden wie ein xargs
Befehl 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.
\;
würde der ausgeführte Befehl lautencat 1; cat 2; cat 3
. Mit+
wäre der ausgeführte Befehlcat 1 2 3
.+
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. :)-exec <command> {} ';'
weil es das Tippen erleichtert (ich kann tippen, aber ich habe nicht genau die beste Technik).-exec ... {} +
ist POSIX. Siehe: pubs.opengroup.org/onlinepubs/9699919799/utilities/…-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).