Respuestas:
-exec ... \;
ejecutará un elemento tras otro. Entonces, si tiene tres archivos, la línea ejecutiva se ejecutará tres veces.
-exec ... {} +
es para comandos que pueden tomar más de un archivo a la vez (p cat
. ej . stat
, ls
). Los archivos encontrados por find
están encadenados como un xargs
comando. Esto significa menos bifurcación y para operaciones pequeñas, puede significar una aceleración sustancial.
Aquí hay una demostración de rendimiento que captura 10,000 archivos vacíos.
$ 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
Nuevamente, esto solo funciona en comandos que pueden tomar múltiples nombres de archivo. Puede averiguar si su comando es así mirando su página de manual. Aquí está la sinopsis de man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
La elipsis en [FILE]...
significa que puede tomar más de un archivo.
+
solo se puede usar en comandos individuales y debe tener exactamente uno {}
en la línea. \;
puede operar con múltiples grupos de cero a muchos.
+
no es POSIX, por lo que puede no estar disponible en sistemas que no sean Linux. No es una preocupación si nunca abandonas la plataforma, pero es bueno saber si alguna vez tienes que usar Solaris. :)
-exec <command> {} ';'
porque es más fácil para escribir (puedo tocar escribir pero no tengo exactamente la mejor técnica).
-exec ... {} +
es POSIX. Ver: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
-exec ... {} +
extensión se sugirió para su inclusión en las especificaciones POSIX en 2001 y se ratificó en el problema POSIX 6 en 2004. Es posible que la versión de Solaris a la que está acostumbrado sea más antigua que el estándar POSIX (o solo se dirija a una versión anterior).
\;
, el comando ejecutado seríacat 1; cat 2; cat 3
. Con+
, el comando ejecutado seríacat 1 2 3
.