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.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.