¿Usa rsync para mover (no copiar) archivos entre directorios?

55

He estado usando rsync para copiar archivos por algún tiempo. Tengo entendido que rsync es más rápido que cp cuando algunos de los archivos a transferir ya están en el directorio de destino, transfiriendo solo la diferencia incremental (es decir, los "deltas").

Si esto es correcto, ¿tendría alguna ventaja usar rsync para mover el contenido de una carpeta A , por ejemplo, una carpeta B , con B vacío?

La carpeta A tiene cerca de 1 TB de datos (y millones de archivos). La transferencia se realizaría a través de una red local ( A y B en diferentes sistemas de archivos, ambos montados en una supercomputadora, por ejemplo, A es NFS y B es lustre ).

Aparte de eso, ¿qué indicadores debo usar para pedirle a rsync que mueva (no copie) archivos de A a B (es decir, que elimine A cuando la transferencia haya finalizado con éxito)?

Amelio Vazquez-Reina
fuente
77
No creo que rsyncpueda reemplazar mv. Esperaría mvser más rápido en la mayoría de los tipos de sistemas de archivos cuando el origen y el destino están dentro del mismo sistema de archivos, ya rsyncque tendría que hacer una copia sin importar qué, y mvprobablemente podría salirse con el cambio de algunas entradas de directorio. Lo más parecido que puedo encontrar a un rsync mves el --remove-source-filescomando, pero eso no elimina los directorios.
jw013
2
Gracias @ jw013! Solo para aclarar, los archivos están en diferentes sistemas de archivos, y la transferencia se haría en una red . ¿Sabes si eso todavía sería mvmás rápido?
Amelio Vazquez-Reina
1
Bueno, mvno puede operar a través de una red; tendría que depender de un montaje local (por ejemplo, NFS). Si el cuello de botella es la red, rsyncprobablemente sería más rápido que mvporque rsyncpuede hacer compresión.
jw013
2
Por cierto cptiene -ula opción de copiar el archivo de origen si es más reciente que el archivo de destino o cuando el archivo de destino no se encuentra
fiebre del

Respuestas:

69

Puede pasar --remove-source-filesa rsync para mover archivos en lugar de copiarlos.

Pero en su caso, no tiene sentido usar rsync, ya que el destino está vacío. Un llano mvhará el trabajo lo más rápido posible.

En su caso, lo que podría marcar una diferencia en el rendimiento es la elección del protocolo de red, si tiene la opción de elegir entre NFS, Samba, sshfs, sftp, rsync sobre ssh, tar pipe en ssh, etc. La velocidad relativa de estos métodos depende en cuanto al tamaño de los archivos, la red y el ancho de banda del disco, y otros factores, por lo que no hay forma de dar consejos generales, deberá ejecutar sus propios puntos de referencia.

Gilles 'SO- deja de ser malvado'
fuente
66
Solo para reiterar lo que dice Caleb, si le preocupa la corrupción debido, por ejemplo, a una red débil, rsync puede tener sentido, ya que verifica cada archivo que escribe sumando una suma de verificación a los bloques a medida que los escribe.
Daniel S. Sterling
55
el --remove-source-filessolo elimina los archivos en la fuente. si desea borrar nuestra fuente, ¿no tendría que hacer un rm -rf (o findtodos los directorios y pasar -delete) en la fuente después de que rsync se ejecute correctamente?
Trevor Boyd Smith
1
@ DanielS.Sterling rsync no bloquea los bloques de suma de verificación después de escribirlos (usa sumas de verificación para encontrar qué partes de los archivos existentes se actualizaron y deben sincronizarse). Puede hacer una segunda sincronización --checksumpara indicarle que verifique los resultados de la primera sincronización.
Clément
19

Como --remove-source-filesno elimina directorios, emito los siguientes comandos para mover archivos a través de ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* [email protected]:/home/user/backup
find . -type d -empty -delete

Personalmente, me gusta la --progressfunción, ya que hago esta transferencia manualmente. Elimínelo si está utilizando un script. Espero que ralentice las transferencias marginalmente. La findopción de eliminación del comando solo elimina directorios vacíos; no los use rm -rf, ya que puede eliminar directorios no vacíos en caso de que no se transfiera un archivo. La -deleteopción activa la -depthopción para que los árboles de directorios vacíos se eliminen de "abajo" hacia arriba.

Kristian
fuente
3
-deletees mucho más agradable que -exec rmdir {} +etc.
lkraav
1
Me saltaría el asterisco porque y solo tengo barras diagonales / con rutas si lo hago localmente. Si usa asterisco, rsync omitirá los archivos ocultos como .htaccess o .htpasswd (si corresponde)
Svetoslav Marinov
16

En general, como dijo Gilles, no hay ninguna ventaja en usar rsyncpara mover archivos cuando se mvhará el mismo trabajo de manera más simple y no hay una ganancia potencial de velocidad entre los sistemas de archivos normales.

Sin embargo, hay ocasiones en que hay una ventaja. En particular, si tiene dudas sobre la estabilidad de la fuente, el destino o la máquina que realiza el trabajo, el uso rsyncle brinda la capacidad de reanudar. Esto puede ser una ventaja notable si la transferencia es muy grande y, por ejemplo, su red eléctrica no es confiable. El uso de rsync será una forma más estable de evitar la corrupción de datos en caso de falla y continuar donde lo dejó.

Caleb
fuente
55
Yo diría que esta es una gran ventaja. De hecho, diría mvque solo es mejor si el destino y la fuente están en la misma partición, de modo que mvsolo edita los metadatos del archivo en lugar de hacer una copia.
nomen
2
Una vez que necesito en rsynclugar de mv es cuando quiero preservar la estructura de la carpeta (si la usa --relative).
Sridhar Sarnobat
15

¿habría alguna ventaja en usar rsync para mover el contenido de una carpeta A, por ejemplo, una carpeta B, con B vacío?

Me he encontrado en una situación en la que rsync ES más rápido que mv simplemente porque mv no puede manejar la cantidad de archivos en el directorio. Tengo 1,8 millones de fotos de una cámara de seguridad que funcionó durante 20 días y el comando mv sale con un error porque no puede asignar recursos.

Sin embargo, rsync parece manejar todos los archivos sin problemas.

shadowv
fuente
1

Si desea fusionar directorios de forma recursiva ... mueva un directorio a otro directorio con nombres de directorio potencialmente duplicados , entonces vea mi respuesta aquí en serverfault.com. mvhace un mal trabajo cuando existen directorios con el mismo nombre, y rsynccopia (leer + escribir datos completos) cada archivo en lugar de simplemente moverlos (leer y escribir solo metadatos).

Peter
fuente
0

No hay forma de mover archivos usando rsync como lo haría el comando mv de Linux. Al usar --remove-source-files, esencialmente está copiando archivos al destino y luego eliminando archivos (excepto directorios) de la fuente. Esto puede lograr su propósito de mover archivos, pero NO ahorrará tiempo u operación de E / S.

Gehendra Acharya
fuente