En este paso, aprenderás a sincronizar archivos entre sistemas utilizando el comando rsync. rsync es una herramienta potente y versátil para copiar y sincronizar archivos y directorios, tanto local como remotamente. Su principal ventaja es la capacidad de transferir solo las diferencias entre archivos, lo que la hace altamente eficiente para actualizaciones. Al igual que sftp, rsync puede utilizar SSH para transferencias seguras y cifradas.
Las opciones más comunes para rsync incluyen:
-a o --archive: Esta es una combinación de varias opciones (-rlptgoD) que preserva la mayoría de los atributos de los archivos (recursivo, enlaces, permisos, fechas, grupo, propietario, archivos de dispositivo). A menudo se la conoce como "modo de archivo" y se recomienda encarecidamente para la mayoría de las tareas de sincronización.
-v o --verbose: Aumenta la verbosidad, mostrando más detalles sobre la transferencia.
-z o --compress: Comprime los datos del archivo durante la transferencia, lo que puede acelerar las transferencias a través de enlaces lentos.
-h o --human-readable: Muestra los números en un formato legible por humanos.
-n o --dry-run: Realiza una prueba de funcionamiento sin realizar ningún cambio. Esto es extremadamente útil para verificar qué hará rsync antes de ejecutar realmente el comando.
Comencemos asegurándonos de estar en tu directorio ~/project.
cd ~/project
Simularemos un escenario de sincronización creando un directorio de origen y un directorio de destino.
Crea un directorio de origen source_dir con algunos archivos:
mkdir source_dir
echo "Contenido del archivoA" > source_dir/fileA.txt
echo "Contenido del archivoB" > source_dir/fileB.txt
mkdir source_dir/subdir
echo "Contenido del archivo subfile1" > source_dir/subdir/subfile1.txt
Crea un directorio de destino vacío dest_dir:
mkdir dest_dir
Ahora, realicemos una prueba de funcionamiento para ver qué haría rsync al sincronizar source_dir con dest_dir. Usaremos las opciones -avh para el modo de archivo, salida detallada y tamaños legibles por humanos, junto con -n para la prueba de funcionamiento.
rsync -avhn source_dir/ dest_dir/
Nota importante sobre las barras inclinadas finales:
source_dir/: La barra inclinada final significa "copiar el contenido de source_dir".
source_dir: Sin barra inclinada final significa "copiar source_dir en sí mismo al destino".
La salida de la prueba de funcionamiento te mostrará los archivos que se transferirían:
enviando lista de archivos incremental
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt
enviados 186 bytes recibidos 12 bytes 396.00 bytes/seg
tamaño total es 66 aceleración es 0.33 (PRUEBA DE FUNCIONAMIENTO)
Observa (PRUEBA DE FUNCIONAMIENTO) al final, indicando que no se realizaron cambios reales.
Ahora, realicemos la sincronización real. Elimina la opción -n.
rsync -avh source_dir/ dest_dir/
La salida será similar a la prueba de funcionamiento, pero sin la etiqueta (PRUEBA DE FUNCIONAMIENTO):
enviando lista de archivos incremental
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt
enviados 186 bytes recibidos 12 bytes 396.00 bytes/seg
tamaño total es 66 aceleración es 0.33
Verifica que los archivos se hayan copiado a dest_dir:
ls -R dest_dir
Debes ver:
dest_dir:
fileA.txt fileB.txt subdir
dest_dir/subdir:
subfile1.txt
Ahora, modifiquemos un archivo en source_dir y agreguemos un nuevo archivo para ver la eficiencia de rsync.
echo "Contenido actualizado para fileA" > source_dir/fileA.txt
echo "Contenido del nuevo archivo" > source_dir/new_file.txt
Realiza otra prueba de funcionamiento para ver qué transferirá rsync esta vez:
rsync -avhn source_dir/ dest_dir/
La salida mostrará solo los archivos modificados y nuevos:
enviando lista de archivos incremental
./
fileA.txt
new_file.txt
enviados 128 bytes recibidos 12 bytes 280.00 bytes/sec
tamaño total es 100 aceleración es 0.71 (PRUEBA DE FUNCIONAMIENTO)
Esto demuestra la capacidad de rsync de transferir solo las diferencias.
Ahora, realiza la sincronización real de nuevo:
rsync -avh source_dir/ dest_dir/
Verifica el contenido de dest_dir de nuevo:
ls -R dest_dir
cat dest_dir/fileA.txt
cat dest_dir/new_file.txt
Debes ver new_file.txt en dest_dir y fileA.txt debe contener "Contenido actualizado para fileA".