Risposte:
-exec ... \;
eseguirà un elemento dopo l'altro. Quindi, se hai tre file, la riga exec verrà eseguita tre volte.
-exec ... {} +
è per i comandi che possono prendere più di un file alla volta (per esempio cat
, stat
, ls
). I file trovati da find
sono concatenati insieme come un xargs
comando. Ciò significa meno forking out e per piccole operazioni, può significare un notevole aumento di velocità.
Ecco una demo delle prestazioni che cattura 10.000 file vuoti.
$ 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
Ancora una volta questo funziona solo su comandi che possono assumere più nomi di file. Puoi capire se il tuo comando è così guardando la sua manpage. Ecco la sinossi di man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
I puntini di sospensione [FILE]...
indicano che può richiedere più di un file.
+
può essere utilizzato solo su singoli comandi e devi averne esattamente uno {}
nella riga. \;
può operare con più gruppi da zero a molti.
+
non è POSIX, quindi potrebbe non essere disponibile su sistemi non Linux. Non è un problema se non si abbandona mai la piattaforma, ma è bene sapere se è necessario utilizzare Solaris. :)
-exec <command> {} ';'
perché è più semplice scrivere (posso toccare il tipo ma non ho esattamente la tecnica migliore).
-exec ... {} +
è POSIX. Vedi: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
-exec ... {} +
estensione è stata suggerita per l'inclusione nelle specifiche POSIX nel 2001 ed è stata ratificata nel numero 6 di POSIX nel 2004. È possibile che la versione di Solaris a cui sei abituato sia più vecchia di quella standard POSIX (o abbia come target una versione precedente).
\;
, il comando eseguito sarebbecat 1; cat 2; cat 3
. Con+
, il comando eseguito sarebbecat 1 2 3
.