Solución 1:
Yo usaría rsync porque significa que si se interrumpe por algún motivo, puede reiniciarlo fácilmente con un costo muy bajo. Y al ser rsync, incluso puede reiniciarse a la mitad de un archivo grande. Como otros mencionan, puede excluir archivos fácilmente. La forma más sencilla de conservar la mayoría de las cosas es usar el -a
flag – 'archivo'. Entonces:
rsync -a source dest
Aunque el UID/GID y los enlaces simbólicos se conservan mediante -a
(ver -lpgo
), su pregunta implica que es posible que desee un completo copia de la información del sistema de archivos; y -a
no incluye enlaces duros, atributos extendidos o ACL (en Linux) ni los ni anteriores bifurcaciones de recursos (en OS X). Por lo tanto, para una copia robusta de un sistema de archivos, deberá incluir esos indicadores:
rsync -aHAX source dest # Linux
rsync -aHE source dest # OS X
El cp predeterminado comenzará de nuevo, aunque el -u
el indicador "se copiará solo cuando el archivo ORIGEN sea más nuevo que el archivo de destino o cuando falte el archivo de destino" . Y el -a
El indicador (archivo) será recursivo, no volverá a copiar los archivos si tiene que reiniciar y conservar los permisos. Entonces:
cp -au source dest
Solución 2:
Al copiar al sistema de archivos local, tiendo a usar rsync con las siguientes opciones:
# rsync -avhW --no-compress --progress /src/ /dst/
Este es mi razonamiento:
-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)
He visto transferencias un 17 % más rápidas usando la configuración de rsync anterior sobre el siguiente comando tar como lo sugiere otra respuesta:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Solución 3:
Cuando tengo que copiar una gran cantidad de datos, suelo utilizar una combinación de tar y rsync. El primer paso es alquitranarlo, algo como esto:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Por lo general, con una gran cantidad de archivos, habrá algunos que tar no puede manejar por cualquier motivo. O tal vez el proceso se interrumpa, o si se trata de una migración del sistema de archivos, es posible que desee realizar la copia inicial antes del paso de migración real. En cualquier caso, después de la copia inicial, realizo un paso rsync para sincronizarlo todo:
# cd /dst; rsync -avPHSx --delete /src/ .
Tenga en cuenta que la barra diagonal final en /src/
es importante.
Solución 4:
rsync
Aquí está el rsync que uso, prefiero cp para comandos simples, no esto.
$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/
cpio
Aquí hay una forma que es aún más segura, cpio. Es tan rápido como el alquitrán, quizás un poco más rápido.
$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null
alquitrán
Esto también es bueno y continúa con errores de lectura.
$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -
Tenga en cuenta que todos son solo para copias locales.
Solución 5:
Este hilo fue muy útil y debido a que había tantas opciones para lograr el resultado, decidí comparar algunas de ellas. Creo que mis resultados pueden ser útiles para que otros tengan una idea de lo que funcionó más rápido.
Para mover 532Gb de datos distribuidos entre 1.753.200 archivos tuvimos esos tiempos:
rsync
tomó 232 minutostar
tomó 206 minutoscpio
tomó 225 minutosrsync + parallel
tomó 209 minutos
En mi caso preferí usar rsync + parallel
. Espero que esta información ayude a más personas a decidir entre estas alternativas.
Los puntos de referencia completos se publican aquí