Para copiar un directorio de forma recursiva, usar tar
para empaquetar un directorio y luego canalizar la salida a otro tar
para desempaquetar parece ser mucho más rápido que usar cp -r
(o cp -a
).
¿Por qué es esto? ¿Y por qué no se cp
puede hacer más rápido haciéndolo de la misma manera debajo del capó?
Editar: Noté esta diferencia al intentar copiar una enorme estructura de directorios que contenía decenas de miles de archivos y carpetas, profundamente anidadas, pero con un total de solo unos 50 MB. No estoy seguro si eso es relevante.
Respuestas:
Cp
hace abrir-leer-cerrar-abrir-escribir-cerrar en un bucle sobre todos los archivos. Entonces, leer de un lugar y escribir en otro ocurre completamente entrelazado.Tar|tar
lee y escribe en procesos separados, y ademástar
utiliza múltiples hilos para leer (y escribir) varios archivos 'a la vez', permitiendo efectivamente que el controlador de disco recupere, almacene y almacene muchos bloques de datos a la vez. En general,tar
permite que cada componente funcione de manera eficiente, al tiempo quecp
analiza el problema en fragmentos dispares e ineficientemente pequeños.fuente
cp
implementaciones? ¿Cómo sabemos que es verdad? ¿Y por qué secp
escribiría de una manera tan ineficiente? Cualquier implementación de libro de texto de una copia de archivo lee un búfer de n bytes a la vez y los escribe en el disco antes de leer otros n bytes. ¿Pero dice quecp
siempre lee el archivo completo antes de escribir la copia completa?