Vamos directamente a un caso practico, moviendo/ 500.000 ficheros/ con find -exec ; tardamos /88 minutos/:
# find /target/tmp/ -type f | wc -l
524275
1 |
# 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
1 |
# 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
1 |
# 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”/.