¿Conseguir que rsync mueva el archivo del origen al destino?

¿Conseguir que rsync mueva el archivo del origen al destino?

¿Rsync es una buena opción para mi proyecto?

Tengo que:
- copiar archivos de la carpeta de origen a la de destino a través de SSH,
- asegurarme de que todos los archivos estén copiados,
- eliminar los archivos de origen después de copiarlos.
- Si tengo un nombre en conflicto, tengo que cambiar el nombre de los archivos.

Parece que puedo usar la opción: --remove-source-files (para eliminar archivos fuente)
Pero, ¿cómo gestiona rsync los conflictos? ¿Puedo tener reglas?

Caso de uso en mi proyecto:

Ejecuto cálculos científicos en el servidor A y los resultados se insertan en la carpeta "proceso", para cada cálculo tengo un repositorio como este: /process/calc1.
Ahora me gustaría transferir el repositorio "/calc1" al servidor B (obtengo /process/calc1) y eliminar "calc1" del servidor A.
... Durante otro cálculo obtengo "/process/calc2" en el servidor A, la idea también es mover "calc2" en el directorio "/process/" en el servidor B, luego tengo ahora en el servidor B:
- /process/calc1
- /process/calc2
(y /process/ en el servidor A está vacío).

¿Cómo gestionará rsync el conflicto (en el servidor B) si tengo otra carpeta como "/process/calc1" en el servidor A después de un nuevo cálculo (si "/process/calc1" ya existe en el servidor B)?

¿Es posible agregar reglas con rsync y cambiar el nombre de "/process/calc1" por "process/calc1R2" en el servidor B? ¿Y así sucesivamente (por ejemplo, calc1R3)?

Gracias.

Respuesta1

Si realmente desea utilizar rsync, parece que necesitará alguna combinación de --backup, --backup-dir y --suffix. Lo más cerca que creo que podrías llegar es con algo como esto.

rsync -abv --suffix R1 --remove-source-files src/ dst/

Esto se acercaría a lo que desea, pero no cambiaría el nombre de los archivos exactamente como desea. La opción --suffix agrega texto al final de un archivo existente, pero solo lo hace para el primer conflicto. Si lo ejecuta nuevamente, simplemente sobrescribirá su primera copia de seguridad. Tendrías que cambiar ese valor de sufijo cada vez que se ejecute el comando, lo que funcionaría si usaras algo con una marca de tiempo, como esto:

rsync -abv --suffix `date +%Y%m%d%k%M%S` --remove-source-files src/ dst/

No estoy seguro de si esto es excesivo para lo que buscas, pero debería cumplir con tus requisitos.

Respuesta2

Como su nombre lo indica, rsync se utiliza para sincronizar archivos. Cuando está "sincronizado", esto significa que los archivos en el origen y el destino son los mismos. Eso no parece lo que quieres hacer.

Parece que sólo quieres mover algunos archivos. No necesitas usar rsync para eso. Parece que estás usando Linux o BSD. Podrías usar mv -n sobre ssh. La opción -n no sobrescribe los archivos existentes. Esto no es 100% automático. Sin embargo, no veo cómo el archivo podría existir ya en su caso. Los archivos se copiarán del origen al destino y luego se eliminarán del origen. ¿Quieres volver a ejecutar los mismos cálculos? ¿Es por eso que terminarás con archivos con el mismo nombre? Sugeriría agregar un número de ejecución o lote al nombre de la carpeta. Querrás que eso quede claro de todos modos. ¿Tiene algún control sobre el nombre de la carpeta? ¿Algún detalle más? Recomiendo poner los comandos en un script bash o similar.

Respuesta3

Para SSH, en resumen, use esto:

Acceso a través de shell remoto:

Extraer: rsync [OPCIÓN...] [USUARIO@]HOST:SRC... [DEST]

Push: rsync [OPCIÓN...] SRC... [USUARIO@]HOST:DEST

Todo está explicado en rsync(1).

En cuanto a escribir un script para un cronjob, para rsync a través de ssh automáticamente sin requerir una contraseña, consulte también ssh-agent(1).

información relacionada