Linux rsync: Cómo sincronizar archivos localmente y a través de SSH
rsync es una herramienta que copia archivos y directorios a sistemas locales o remotos y transfiere cambios. El comportamiento predeterminado es copiar en una sola dirección desde el origen al destino, y los archivos que existen solo en el destino no se eliminan a menos que se especifique --delete.
Antes de comenzar
Los ejemplos se ejecutan en la terminal de Linux. Primero, verifica si está instalado con rsync --version. En Ubuntu, si no está instalado, puedes instalarlo con el siguiente comando. Para transferencias remotas, se requiere rsync en ambos sistemas, y si se utiliza SSH (Secure Shell), también se necesita acceso remoto y permisos de escritura en la ruta de destino.
sudo apt update
sudo apt install rsync
Si introduces las rutas de origen y destino al revés, puedes sobrescribir o eliminar los datos que deseas. Antes de manejar datos importantes, asegúrate de tener una copia de seguridad separada, y especialmente al usar la opción de eliminar, primero verifica los cambios esperados con --dry-run. La sincronización es diferente de una copia de seguridad que restaura un punto anterior, porque los errores o la corrupción en el origen también pueden reflejarse en el destino.
Copia del directorio local y la diferencia de la barra
El siguiente es un ejemplo de cómo crear una nueva carpeta de práctica en el directorio home y preparar un archivo. Si existe una carpeta con el mismo nombre, use un nombre diferente.
mkdir -p "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest"
printf 'hello\n' > "$HOME/rsync-demo/source/hello.txt"
rsync -av "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
ls -l "$HOME/rsync-demo/dest/"
Si hello.txt aparece en el resultado del último comando, el contenido del directorio de origen se ha copiado en el objetivo. Ejecutar el mismo comando rsync nuevamente generalmente no vuelve a transferir archivos ordinarios que no han cambiado. La comparación básica usa el tamaño de archivo y la fecha de modificación, por lo que no es una verificación completa de que los contenidos sean iguales.
El / al final de la fuente significa que se copian al destino los contenidos dentro del directorio, no el directorio en sí. Si el directorio de destino ya existe y omites la barra, el nombre del directorio de origen se creará bajo el destino.
rsync -av "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest/"
Ejecutar este comando creará dest/source/hello.txt. El dest/hello.txt previamente creado permanecerá tal como está. La diferencia entre las dos rutas es especialmente importante al usar la opción de eliminar. Si hay espacios en la ruta, enciérralo entre comillas como en el ejemplo.
Opciones y verificaciones previas de uso frecuente
-a: Este es el modo de archivo. Solicita la copia recursiva y la preservación del tiempo, permisos, propietario, grupo y enlaces simbólicos. La preservación de la propiedad puede estar limitada dependiendo de los permisos y del soporte del sistema de archivos de destino. Las ACL y los atributos extendidos no están incluidos en-a.-v: Muestra la salida detallada de la operación.-no--dry-run: Muestra las operaciones esperadas sin realmente realizar ningún cambio.-z: Utiliza compresión durante la transferencia. La efectividad varía dependiendo de las condiciones de la red y los tipos de archivo y no siempre es necesaria para copias locales.
Por ejemplo, puedes verificar lo siguiente antes de la copia real. La salida muestra los cambios esperados, y si los archivos cambian o ocurren errores entre una prueba y la ejecución real, el resultado real puede diferir.
rsync -avn "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
Si necesitas comprobar si los archivos con el mismo tamaño y hora de modificación realmente tienen contenido diferente, puedes considerar la comparación --checksum, pero puede ser costosa ya que ambos archivos se leen. Para el significado detallado de las opciones, consulta manual oficial de rsync.
Eliminar archivos que existen solo en el destino
--delete elimina elementos del directorio de destino de sincronización que no existen en la fuente. Si accidentalmente especifica el destino o nivel de directorio incorrecto, también se pueden eliminar archivos necesarios, por lo que primero verifique la ruta de destino y la barra inclinada final de la fuente y revise los resultados de una ejecución de prueba.
El siguiente ejemplo puede listar elementos que existen solo en el destino, como el creado anteriormente con dest/source/, para su eliminación. Ejecútelo solo cuando no haya archivos que conservar en la carpeta de práctica.
rsync -avn --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
Verifique las entradas de deleting en la salida y solo elimine -n para ejecutarlo de manera real si el rango de eliminación es correcto y las copias de seguridad para recuperación están listas.
rsync -av --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
Este comando solo cambia el destino y no elimina archivos de la fuente. Los archivos que existían únicamente en el destino pueden no ser recuperables sin los procedimientos habituales de recuperación de archivos. Prepare copias de seguridad de versiones separadas y verificación de restauración para los datos operativos.
Excluyendo Archivos o Directorios
Para excluir el directorio cache de la fuente del objetivo de transferencia, especifíquelo de la siguiente manera. Debido a que el contenido de la fuente es la raíz de la transferencia, la barra inicial se refiere a cache en esa raíz. Primero, ejecute un ensayo para asegurarse de que solo se excluyan los elementos deseados.
rsync -avn --exclude='/cache/' "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
Si el resultado es correcto, elimine -n y cópielo. La regla de exclusión predeterminada generalmente protege los elementos de exclusión del destino en --delete, pero usar --delete-excluded o cambiar las reglas de filtrado puede modificar el comportamiento. Verifique los patrones complejos en una carpeta separada antes de aplicarlos a datos reales.
Sincronizar con un servidor remoto vía SSH
En un entorno listo para acceso por SSH, el siguiente comando envía el contenido de la fuente local al directorio de destino en el servidor remoto. Reemplace user, server.example.com, y las rutas por valores reales, y prepare el directorio de destino remoto con antelación. Al conectarse por primera vez, verifique la huella digital (fingerprint) de la clave del servidor a través de un canal de confianza.
rsync -avn -e ssh "$HOME/rsync-demo/source/" user@server.example.com:/home/user/backup/
Después de revisar la lista de transferencia esperada, elimine -n para transferir. Por el contrario, para recuperar del servidor remoto a la máquina local, configure la ruta remota como la ubicación de origen.
rsync -avn -e ssh user@server.example.com:/home/user/backup/ "$HOME/rsync-demo/dest/"
Si el puerto SSH difiere del predeterminado, por ejemplo, use -e 'ssh -p 2222'. Para el acceso remoto, se recomienda usar una cuenta con permisos limitados y autenticación por clave SSH. No ingrese directamente la contraseña en el comando porque puede exponerse en la información del proceso o en el historial de la terminal; por lo tanto, no se usa el ejemplo sshpass -p del artículo anterior. En tareas automatizadas, gestione juntos la protección de la clave y el alcance del acceso.




