¿Cómo hago para que rsync elimine archivos que se han eliminado de la carpeta de origen?

¿Cómo hago para que rsync elimine archivos que se han eliminado de la carpeta de origen?

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 crontarea para copiar automáticamente esas copias de seguridad a mi carpeta de Dropbox todas las noches usando rsync con la -aopció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 rsynctarea 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, rsyncsó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 rsyncque podrían funcionar, pero como no estoy familiarizado con ellas.

Respuesta1

Para eliminar archivos en el destino, agregue la --deleteopción a su comando. Por ejemplo:

rsync -avh source/ dest/ --delete

NB: -avhes para--archive --verbose --human-readable

Respuesta2

ElsincronizaciónEl comando no eliminará ningún archivo mientras use algunas de sus opciones deleteen 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 rsyncpara hacer una copia de seguridad de los archivos de origen y que lo utilice find ... rmpara 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 deleteopciones son solo para TARGET, si algunos archivos se eliminan de la fuente, rsync --deleteelimínelos de TARGET. Y la deleteopción by aftery before, como se menciona en su página de manual:

--delete-before         receiver deletes before transfer, not during

Significa que:

  1. rsync elimina el archivo de TARGET que se elimina de SOURCE.
  2. rsync comienza a sincronizar archivos.
--delete-after          receiver deletes after transfer, not during

Significa que:

  1. rsync comienza a sincronizar archivos.
  2. 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

  1. archivosagregadoenlocalse agregan aremoto
  2. archivosremotodelocalson eliminados deremoto
  3. archivosagregadoenremotoson removidos
  4. archivosremotoderemotoson restaurados delocalsi existen, de lo contrario se ignoran

Los parámetros explicados:

  • -amodo de archivo
  • -vaumentar la verbosidad
  • -hnúmeros de salida en un formato legible por humanos
  • -nejecució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-aftero --delete-before.

Por eso es importante abordar los errores de rsync.

La mayoría de mis errores se debieron al uso de la --permsopción mientras sincronizaba con un sistema de archivos que no es Linux. Cuando lo reemplacé --permscon --no-perms, esos errores desaparecieron y luego la eliminación funcionó.

--permsestá 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), --permscausa 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-permspara evitar esos errores que sabotean --delete, --delete-aftero --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-errorsargumento, por lo que se eliminará incluso si hay errores.

información relacionada