
Recientemente configuré una máquina con Ubuntu Server para alojar servidores de juegos. Instalé un complemento de respaldo para cada servidor de juegos que crea copias de seguridad frecuentes de los archivos del mundo del juego en una carpeta particular de la máquina. También establecí una cron
tarea para copiar automáticamente esas copias de seguridad a mi carpeta de Dropbox todas las noches usando rsync con la -a
opción.
Después de unos meses, mi cuenta de Dropbox alcanzó su límite de almacenamiento y me di cuenta de que no podría conservar tantas copias de seguridad, así que configuré el complemento de copia de seguridad del servidor del juego para no retener tantas copias de seguridad y luego esperé unos días para ver si funcionaba. elimine las copias de seguridad más antiguas, como está programado para hacerlo semanalmente. El complemento de copia de seguridad finalmente hizo su trabajo y eliminó las copias de seguridad más antiguas, por lo que esperaba que la rsync
tarea cron eliminara posteriormente las copias de seguridad más antiguas de mi carpeta de Dropbox para que coincidieran con la carpeta de origen, pero no lo hizo. Entonces tengo un par de preguntas:
Por defecto,
rsync
sóloagregararchivos a la carpeta de destino que se han agregado a la carpeta de origen ycambiararchivos que se han modificado en la carpeta de origen peroNO eliminar¿Archivos que se eliminaron de la carpeta de origen?Si ese es el caso, ¿cuál es la mejor manera de hacerlo
rsync
? Quiero que la carpeta de destino refleje perfectamente la carpeta de origen, y eso significa eliminar todos los archivos que se hayan eliminado de la carpeta de origen.
Veo algunas opciones enumeradas en la página del manual rsync
que podrían funcionar, pero como no estoy familiarizado con ellas.
Respuesta1
Para eliminar archivos en el destino, agregue la --delete
opción a su comando. Por ejemplo:
rsync -avh source/ dest/ --delete
NB: -avh
es para--archive --verbose --human-readable
Respuesta2
ElsincronizaciónEl comando no eliminará ningún archivo mientras use algunas de sus opciones delete
en ese comando. Entonces, si se agrega algún archivo o carpeta en el origen, se sincronizará con el destino sin eliminarlo.
Le sugiero que lo utilice rsync
para hacer una copia de seguridad de los archivos de origen y que lo utilice find ... rm
para eliminar archivos por un período de tiempo o tamaño de los archivos:
rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
El bloque de código anterior, haga una copia de seguridad de la fuente y luego elimine todos los archivos cuya última modificación haya sido hace más de 2 meses.
ACTUALIZAR
Como encuentro que las delete
opciones son solo para TARGET, si algunos archivos se eliminan de la fuente, rsync --delete
elimínelos de TARGET. Y la delete
opción by after
y before
, como se menciona en su página de manual:
--delete-before receiver deletes before transfer, not during
Significa que:
- rsync elimina el archivo de TARGET que se elimina de SOURCE.
- rsync comienza a sincronizar archivos.
--delete-after receiver deletes after transfer, not during
Significa que:
- rsync comienza a sincronizar archivos.
- rsync elimina el archivo de TARGET que se elimina de SOURCE después de la sincronización.
NOTA: El --delete-{before/after}
implemento justo en TARGET.
Respuesta3
El comando
$ rsync -avhn --delete local/ remote/
se encarga de sincronizar siempre los cambios realizados localmente con el control remoto. Eso significa que se encarga de sincronizarlocalyremototal que
- archivosagregadoenlocalse agregan aremoto
- archivosremotodelocalson eliminados deremoto
- archivosagregadoenremotoson removidos
- archivosremotoderemotoson restaurados delocalsi existen, de lo contrario se ignoran
Los parámetros explicados:
-a
modo de archivo-v
aumentar la verbosidad-h
números de salida en un formato legible por humanos-n
ejecución en seco, realice una ejecución de prueba sin realizar cambios.Utilice siempre esta bandera inicialmente para evitar la pérdida de datos.. Cuando estés contento, quítalo.
Deje que los resultados hablen por sí solos:
Crear 2 directorios
$ mkdir local/ remote/
Crea archivos en ellos
$ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
Ver lo que se ha creado (antes de rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely remote_only
llamando a rsync:
$ rsync -avh --delete local/ remote/ sending incremental file list deleting remote_only local_only sent 160 bytes received 50 bytes 420.00 bytes/sec total size is 0 speedup is 0.00
Ver el resultado (después de rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely local_only
Como puedes ver, el archivoremoto/solo_remotoha sidoeliminado, el archivolocal/local_soloha sidosincronizado.
Respuesta4
Si hay algún error durante una sincronización de rsync, rsync no eliminará correctamente los archivos que debería tener, incluso si usó --delete
, --delete-after
o --delete-before
.
Por eso es importante abordar los errores de rsync.
La mayoría de mis errores se debieron al uso de la --perms
opción mientras sincronizaba con un sistema de archivos que no es Linux. Cuando lo reemplacé --perms
con --no-perms
, esos errores desaparecieron y luego la eliminación funcionó.
--perms
está bien cuando sincroniza desde un sistema de archivos Linux con otro sistema de archivos Linux, pero si sincroniza desde Linux con un sistema de archivos que no es Linux (como NTFS, FAT), --perms
causa errores porquersync no puede establecer permisos de Linux en sistemas de archivos que no sean Linux. Nuevamente, errores = no eliminar.
- Cuando sincronizo con una partición que no es Linux, uso --no-perms
para evitar esos errores que sabotean --delete
, --delete-after
o --delete-before
.
Si aún recibe errores después de eso y no sabe cómo solucionarlos, puede ejecutar un comando dedicado exclusivamente a eliminar los archivos no sincronizados:
sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination
El comando anterior eliminará el contenido que no esté sincronizado, pero no sincronizará ningún archivo. Entonces, deberías sincronizar nuevamente después de esto. Ese comando se basa en esto.respuesta, excepto que también agregué el --ignore-errors
argumento, por lo que se eliminará incluso si hay errores.