GNU/Linux >> Tutoriales Linux >  >> Linux

¿Copiar un árbol de directorios grande localmente? cp o rsync?

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 minutos
  • tar tomó 206 minutos
  • cpio tomó 225 minutos
  • rsync + 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í


Linux
  1. Filtro Rsync:¿Copiar un solo patrón?

  2. Linux:¿Eliminar eficientemente un directorio grande que contiene miles de archivos?

  3. ¿Crear directorio de destino al extraer Tarball?

  4. cp:directorio omitido – error al copiar un directorio en Linux

  5. ¿Estructura de directorio de CentOS como árbol?

Cómo ver la estructura del árbol de directorios en Linux

Cómo usar Rsync

Ejemplos de comandos rsync de Linux

Exclusión de directorio al crear un archivo .tar.gz

Barras y el comando rsync

tar:elimina los componentes principales del directorio en la extracción