El comando del que partir
rsync -avz src/ user@server:/srv/app/
-acopia carpetas y conserva permisos, fechas y enlaces.-vlista los archivos que transfiere.-zcomprime durante la transferencia, lo que ayuda con texto en un enlace lento y aporta poco con archivos que ya están comprimidos.
Ejecútalo dos veces seguidas y la segunda no lista ningún archivo. Cambia un archivo y lista solo ese.
Para elegir entre las tres herramientas, consulta scp, SFTP o rsync.
La barra final
Una barra al final del origen cambia el resultado. Con una carpeta llamada site:
| Comando | Resultado en el servidor |
|---|---|
rsync -a site server:www/ | www/site/index.html |
rsync -a site/ server:www/ | www/index.html |
Una barra al final del destino no cambia nada en esto.
Puerto o clave distintos
rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/
Una entrada Host en tu configuración SSH también funciona y es más corta: rsync -avz src/ server:/srv/app/.
Archivos grandes: progreso y reanudación
rsync -aP big.bin user@server:/tmp/
-P significa --partial --progress. Sin --partial, rsync borra un archivo que no terminó. Con él, el archivo parcial se queda y la siguiente ejecución lo aprovecha. Detuvimos a medias una transferencia de 30 MB. Sin --partial no quedó ningún archivo en el servidor. Con él quedaron unos 4 MB, el mismo rsync -aP terminó el trabajo y las sumas de verificación de ambas copias coincidieron.
--dry-run y --delete
--delete borra en el destino los archivos que no están en el origen. Previsualiza siempre con --dry-run, o -n:
$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9 speedup is 0.05 (DRY RUN)
El archivo sigue ahí después de esto. Quita -n para hacerlo de verdad.
Tres formas en que --delete hace daño
- Un origen vacío vacía el destino. Una ejecución en seco con una carpeta
empty/vacía como origen planeó borrar todo en el destino. Si falló un montaje y la carpeta de origen está vacía, eso es lo que obtienes. - Una barra equivocada borra más de lo que querías. El destino se compara con el origen tal como lo escribiste, así que con
sitecontrawww/, todo lo demás que haya enwww/se borra. - Las exclusiones interactúan con él. Los archivos excluidos se dejan en paz a menos que añadas
--delete-excluded. En nuestra prueba eso eliminódebug.logdel servidor.
Un límite detiene una ejecución que borraría demasiado. Sale con código 25:
$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)
Otras formas útiles
| Tarea | Comando |
|---|---|
| Descargar | rsync -av server:www/ back/ |
| Omitir archivos | rsync -av --exclude='*.log' site/ server:www/ |
| Ver qué cambiaría y por qué | rsync -ain site/ server:www/ |
| Crear las carpetas que falten en el destino | rsync -a --mkpath site/ server:a/b/c/ |
Sin --mkpath, un destino con más de una carpeta de profundidad falla con mkdir ... failed: No such file or directory.
Errores
Si rsync no está instalado en el servidor, recibes mensajes como estos, y la solución es instalarlo allí:
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)
Una carpeta de origen que no existe da change_dir ... failed: No such file or directory y el código de salida 23.
En un Mac
El rsync del Mac que usamos es openrsync, que informa rsync version 2.6.9 compatible. Manejó las opciones básicas de arriba, pero su ayuda no incluye --mkpath ni --append-verify. Si las necesitas, instala un rsync más reciente con Homebrew.
Preguntas
¿rsync por SSH necesita rsync en el servidor?
Sí. rsync se ejecuta en los dos extremos. Si falta en el servidor obtienes remote command not found (code 127).
¿Cómo uso rsync con otro puerto SSH?
Pasa el comando ssh con -e, por ejemplo rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, o pon el puerto en una entrada Host de ~/.ssh/config.
¿Qué significa la barra final en rsync?
En el origen, src/ copia el contenido de la carpeta y src copia la carpeta misma. En el destino no cambia nada.