Diferencias entre “find -exec comando ;”, “find -exec comando +” y “find | xargs comando”

Vamos directamente a un caso practico, moviendo/ 500.000 ficheros/ con find -exec ; tardamos /88 minutos/:

# find /target/tmp/ -type f | wc -l
524275

 
# time find /target/tmp/ -type f -name ‘*’ -exec mv {} /rescaling/test/ ;

real 88m23.913s
user 5m12.872s
sys 81m43.738s

Si usamos /-exec comando +/ bajamos a/ 4m30s/:

# ls -1 /target/tmp/ | wc -l
524276

# time find /target/tmp/ -type f -name ‘*’ -exec mv -t /rescaling/test/ {} +

real 4m30.750s
user 0m9.777s
sys 1m35.633s

Y como bonus final, con/ find | xargs/, se tardan/ menos de 3 minutos/:

# ls -1 /target/tmp/ | wc -l
524276

# time find /target/tmp -type f -print0 | xargs -P 0 -0 -I {} mv {} /rescaling/test/

real 2m42.905s
user 3m38.539s
sys 14m5.651s

La explicacion, es que en el primer comando, al usarse/ “-exec comando ;” /, lo que ocurre es que se ejecuta un comando mv por cada fichero. Cuando se usa/ “-exec comando +”/, cada comando es agregado al comando y se ejecuta a continuacion, por lo que, tal y como explica la pagina man de find, esto hace que el total de invocaciones es mucho menor y de ahi esa mejora enorme en el rendimiento. Este compartiendo es el mismo que cuando usamos xargs, la diferencia de rendimiento en este caso radica en usar la opcion /“-P”/ que crea tantos procesos como les indiquemos, o infinitos si usamos /“-P 0”/.

Esta entrada fue publicada en Unix - Linux. Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.