¿Cuál es la diferencia entre usar '+' (más) y ';' (punto y coma) en el comando -exec?

28

Me pregunto qué diferencia hay entre usar +y ;al final del -execcomando cuando uso el findcomando.

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

VS

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

Respuestas:

36

-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 findestán encadenados como un xargscomando. 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.

Oli
fuente
44
Ejemplo: con \;, el comando ejecutado sería cat 1; cat 2; cat 3. Con +, el comando ejecutado sería cat 1 2 3.
Alaa Ali
AFAIK, +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. :)
Simon Richter
Oh bien, gracias por la información. Normalmente, -exec <command> {} ';'porque es más fácil para escribir (puedo tocar escribir pero no tengo exactamente la mejor técnica).
hanetzer
2
@SimonRichter: No, -exec ... {} +es POSIX. Ver: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter La -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).
Oli