¿Copiando un árbol de directorio grande localmente? cp o rsync?


230

Tengo que copiar un gran árbol de directorios, aproximadamente 1,8 TB. Todo es local. Por costumbre lo usaría rsync, sin embargo, me pregunto si tiene mucho sentido y si prefiero usarlo cp.

Me preocupan los permisos y uid / gid, ya que deben conservarse en la copia (sé que rsync hace esto). Así como cosas como enlaces simbólicos.

El destino está vacío, así que no tengo que preocuparme por actualizar condicionalmente algunos archivos. Es todo un disco local, así que no tengo que preocuparme por ssh o la red.

La razón por la que me sentiría tentado a alejarme de rsync es porque rsync podría hacer más de lo que necesito. archivos de suma de comprobación rsync. No necesito eso, y me preocupa que pueda llevar más tiempo que cp.

Entonces, ¿qué te parece, rsynco cp?


2
Si rsync hace exactamente lo que quieres que haga, si ya estás familiarizado con su uso para esta aplicación en particular y si funciona lo suficientemente rápido como para tu gusto, ¿por qué querrías cambiar?
once81

2
Porque me preocupa que rsync demore más que cp, ya que rsync realiza muchas sumas de comprobación que cp no funcionará
Rory el

1
La sobrecarga de la CPU de la suma de comprobación es pequeña en comparación con la E / S de disco / red. A menos que el disco esté en el mismo sistema y el sistema operativo pueda hacer una copia inteligente de la unidad de disco en el controlador de bus.
Martin Beckett el

3
La suma de verificación se realiza en archivos que difieren en el tamaño y la verificación de la marca de tiempo. Si está paranoico (como después de un corte de energía durante la copia), puede forzar la suma de verificación en todos los archivos, pero en una transferencia local, eso suele ser más lento que comenzar desde cero.
Korkman

3
Tal vez siente curiosidad por mejorar su flujo de trabajo y no esconde la cabeza en la arena pensando que lo sabe todo. Este comentario realmente me molesta.
Martin Konecny

Respuestas:


204

Usaría rsync, ya que si se interrumpe por cualquier motivo, puede reiniciarlo fácilmente con muy poco costo. Y al ser rsync, incluso puede reiniciarse a mitad de un archivo grande. Como otros mencionan, puede excluir archivos fácilmente. La forma más simple de preservar la mayoría de las cosas es usar la -abandera - 'archivo'. Entonces:

rsync -a source dest

Aunque UID / GID y los enlaces simbólicos se conservan en -a(ver -lpgo), su pregunta implica que es posible que desee una copia completa de la información del sistema de archivos; y -ano incluye enlaces duros, los atributos extendidos, o ACL (en Linux) o los anteriores ni bifurcaciones de recursos (en OS X.) Por lo tanto, para obtener una copia robusta de un sistema de archivos, tendrá que incluir esas banderas:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

El cp predeterminado comenzará de nuevo, aunque el -uindicador "se copiará solo cuando el archivo SOURCE sea más nuevo que el archivo de destino o cuando falte el archivo de destino" . Y el -aindicador (archivo) será recursivo, no volverá a copiar archivos si tiene que reiniciar y preservar los permisos. Entonces:

cp -au source dest

55
El indicador -u de cp probablemente no sea la mejor solución, ya que no detectaría un archivo parcialmente copiado / dañado. Lo bueno de rsync es que puede hacer que md5 sume los archivos para detectar diferencias.
Chad Huneycutt el

3
Agregar la opción -w (--whole-file) aceleraría una rsync interrumpida, ya que simplemente copiará el archivo en lugar de la suma de comprobación.
hayalci

13
en realidad, rsync detecta transferencias locales y habilita la copia de todo el archivo sin sumar automáticamente la suma de comprobación.
korkman

22
y - ¡progreso que es realmente útil!
Matt

12
-P o --progress muestra el progreso de cada archivo individualmente. Es útil para copiar archivos grandes, no para muchos (miles) archivos pequeños, ya que significa muchos más resultados que no puede leer. No muestra el progreso general de todos los archivos combinados.
SPRBRN

106

Cuando copio al sistema de archivos local, siempre uso las siguientes opciones de rsync:

# rsync -avhW --no-compress --progress /src/ /dst/

Aquí está 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 -)

1
Tengo el siguiente error: rsync: --no-compress: unknown option@Ellis Percival.
alper

Esto se aligera rápidamente. Más rápido para hacer esto que rm -rf /src/.
dgo

2
Al igual que @alper, --no-compress no era una opción para mi versión de rsync (en CentOS 7); Usé --compress-level = 0 en su lugar.
Paul

79

Cuando tengo que copiar una gran cantidad de datos, generalmente uso una combinación de tar y rsync. El primer paso es asearlo, 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 podrá manejar por cualquier razón. O tal vez el proceso se interrumpirá, o si se trata de una migración del sistema de archivos, es posible que desee hacer la copia inicial antes del paso de migración real. En cualquier caso, después de la copia inicial, hago un paso rsync para sincronizarlo todo:

# cd /dst; rsync -avPHSx --delete /src/ .

Tenga en cuenta que la barra inclinada final /src/es importante.


66
+1 He descubierto que tar es generalmente más rápido para copias grandes que rsync. También me gusta la idea de terminar con un rsync final.
Geoff Fritz el

2
tar es una buena opción si el directorio de destino está vacío. Aunque mi manera sería: cd $ DSTDIR; alquitrán c -C $ SRCDIR. El | tar
asdmin

19
Esa es la belleza de este método. No necesita duplicar el espacio porque nunca crea un archivo tar intermedio. El alquitrán antes de la tubería empaqueta los datos y los transmite a stdout, y el alquitrán después de la tubería lo toma de stdin y lo desempaqueta.
Chad Huneycutt

44
Hice un cp -a para una transferencia de 12 gb, y este método para una transferencia de 42 gb. El método de alquitrán tomó aproximadamente 1/4 del tiempo.
NGaida

3
También lo puse pven el medio para poder ver el progreso, estimando el tamaño de todos los datos usando df. También lo usé --numeric-owner, ya que el disco de origen era de otro sistema y no quería tartar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
molestar

14

rsync

Aquí está el rsync que uso, prefiero cp para comandos simples, no este.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Aquí hay una manera que es aún más segura, cpio. Es casi 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 fallas 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.


¿Por qué usa los indicadores -S y -D para rsync?
miyalys

7

Lo que sea que prefieras. Simplemente no olvide el -ainterruptor cuando decida usarlo cp.

Si realmente necesita una respuesta: usaría rsync porque es mucho más flexible. ¿Necesita apagar antes de completar la copia? Simplemente ctrl-c y reanude tan pronto como esté de espaldas. ¿Necesita excluir algunos archivos? Solo úsalo --exclude-from. ¿Necesita cambiar la propiedad o los permisos? rsync lo hará por usted.


¿Qué hace la bandera -p nuevamente?
Rory el

1
Preservará la propiedad, las marcas de tiempo y los permisos.
innaM

55
cp -a sería mejor.
David Pashley el

En efecto. La respuesta cambió en consecuencia.
innaM el

7

El rsynccomando siempre calcula sumas de verificación en cada byte que transfiere.

La opción de línea de comando --checksumsolo se relaciona con si las sumas de verificación de los archivos se usan para determinar qué archivos transferir o no, es decir:

-c, --checksum omitir en función de la suma de comprobación, no del tiempo de modificación y el tamaño "

La página de manual también dice esto:

Tenga en cuenta que rsync siempre verifica que cada archivo transferido se haya reconstruido correctamente en el lado receptor al verificar la suma de verificación de todo el archivo, pero que la verificación automática después de la transferencia no tiene nada que ver con la opción antes de la transferencia "¿Necesita este archivo? ¿Para actualizarse?" cheque.

Así rsynctambién, siempre, calcula una suma de verificación de todo el archivo en el lado receptor, incluso cuando la -c/ --checksumopción está "desactivada".


14
Si bien su publicación agregó información interesante aquí, las críticas y los insultos disminuyen el valor de su publicación. Este sitio no es un foro para despotricaciones poco constructivas. Si pudo modificar la fuente, ¿ha enviado sus modificaciones como un parche? ¿Has publicado tu versión en github o algo así? Si te sientes tan fuertemente sobre esto, podría ser mejor si intentas hacer algo un poco más constructivo en lugar de ser innecesariamente insultante.
Zoredache

Sí, el último párrafo no fue realmente necesario.
Vuelo de Sherwin el

6

rsync -aPhW --protocol=28ayuda a acelerar esas copias grandes con RSYNC. Siempre uso rsync porque la idea de estar a mitad de camino a través de 90GiB y romper me asusta lejos de CP


2
¿Cuál es el valor de usar el protocolo anterior en esa cadena de comando?
ewwhite

1
En una máquina Mac, la versión anterior de Rsync enviada se cuelga en algunas revoluciones de protocolo rsync más nuevas, como la 29. Al decirle que se mueva al protocolo anterior, NO se comprueba una y otra vez.
oneguynick

¿Supongo que el número 28 ya no es válido?
SPRBRN

5

rsync es excelente, pero tiene problemas con los árboles de directorio realmente grandes porque almacena los árboles en la memoria. Solo buscaba para ver si solucionarían este problema cuando encontré este hilo.

También encontré:

http://matthew.mceachen.us/geek/gigasync/

También puede dividir manualmente el árbol y ejecutar múltiples rsyncs.


12
Si usa la versión 3, no mantiene todo el árbol en la memoria si es grande, usa un algoritmo de recursión incremental: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

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 532 Gb 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.

El punto de referencia completo se publica aquí.


Página 404 no encontrada
Amedee Van Gasse

1
Gracias @AmedeeVanGasse La URL se ha solucionado poco después de que informaras :)
arjones

¿Por qué no hacer benchmarking cp? Este es el título de la pregunta!
calandoa

@calandoa creo que cpes inseguro, es decir: cuando se rompe tienes que comenzar de nuevo, así es como favorezco las opciones que pueden reanudarse, ergo rsynces mi favorito :)
arjones

3

Cuando hago una copia local de un directorio local, mi experiencia es que "cp -van src dest" es un 20% más rápido que rsync. En cuanto a la reiniciabilidad, eso es lo que hace "-n". Solo necesita rm el archivo parcialmente copiado. No es doloroso a menos que sea un ISO o algo así.


2

¡ARJ ES TAN ANTIGUO EN LA ESCUELA! Realmente dudo que ARJ y / o rsync den rendimiento.

Definitivamente lo que siempre hago es usar cpio:

find . -print | cpio -pdm /target/folder

Esto es casi más rápido que el CP, definitivamente más rápido que el alquitrán y sin canalizar nada.


2
"Las utilidades originales de cpio and find fueron escritas por Dick Haight mientras trabajaba en el grupo de soporte Unix de AT&T. Aparecieron por primera vez en 1977 en PWB / UNIX 1.0" - cpioPágina del manual de FreeBSD .
Chris S

3
cpiodesafortunadamente tiene un límite superior de 8GB para archivos.

" sin canalizar nada " [sic]. Excepto que el findcomando, como lo mencionó, tiene una tubería:find . -print | cpio -pdm /target/folder
warren

1

Definitivamente quieres probar rclone . Esto es una locura rápido:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Esta es una copia local desde y hacia un SSD LITEONIT LCS-256 (256GB).

Puede agregar --ignore-checksumen la primera ejecución para hacerlo aún más rápido.



0

tar también haría el trabajo, pero no reanudará la interrupción como lo hará rsync.


Una vieja respuesta, pero ¿no es TAR para crear archivos comprimidos de archivos? ¿Cómo podría usarse para transferir archivos como rsync o cp?
Sherwin Flight

@SherwinFlight fuente de CD; tar cf -. El | (cd dest; tar xf -)
pgs

0

¿Qué pasa si usas ARJ?

arj a -jm -m1 -r -je filepack /source

donde -jm -m1están los niveles de compresión y lo -jeconvierte en un ejecutable. Ahora tienes un bash encapsulado de archivos.

Luego para la extracción al mapa objetivo

filepack -y  

donde se realizará el mapa fuente (donde -ysiempre se acepta, sobrescribe, omite, etc.)

Luego se puede scp ftp el paquete de archivos al área de destino y ejecutarlo, si es posible.


1
Arj? ¿No se extinguió eso en los años 80?
Michael Hampton

tal vez a principios de los 90 si crees en wikipedia
Matt

0

Hay algunas aceleraciones que se pueden aplicar a rsync:

Evitar

  • -z/ --compress: la compresión solo cargará la CPU ya que la transferencia no se realiza a través de una red sino a través de la RAM.
  • --append-verify: reanudar una transferencia interrumpida. Esto suena como una buena idea, pero tiene el caso de falla peligrosa: cualquier archivo de destino del mismo tamaño (o mayor) que la fuente será IGNORADO. Además, comprueba el archivo completo al final, lo que significa que no se acelera significativamente --no-whole-fileal agregar un caso de falla peligrosa.

Utilizar

  • -S/ --sparse: convierte secuencias de nulos en bloques dispersos
  • --partialo -Pcuál es --partial --progress: guarde los archivos parcialmente transferidos para reanudarlos en el futuro. Nota: los archivos no tendrán un nombre temporal, así que asegúrese de que nada más espere usar el destino hasta que se haya completado la copia completa.
  • --no-whole-filepara que cualquier cosa que deba reenviarse use la transferencia delta. Leer la mitad de un archivo parcialmente transferido suele ser mucho más rápido que volver a escribirlo.
  • --inplace para evitar la copia de archivos (pero solo si nada está leyendo el destino hasta que se complete la transferencia completa)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.