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

194

Recientemente configuré una máquina con Ubuntu Server para alojar servidores de juegos. Instalé un complemento de copia de seguridad para cada servidor de juegos que crea copias de seguridad frecuentes de los archivos del mundo del juego en una carpeta particular en 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 mantener tantas copias de seguridad, así que configuré el complemento de copia de seguridad del servidor del juego para no retener tantas copias de seguridad, luego esperé unos días para ver si lo haría. elimine las copias de seguridad anteriores 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 coincida con la carpeta de origen, pero no lo ha hecho. Entonces tengo un par de preguntas:

  • Por defecto, ¿ rsyncsolo agrega archivos a la carpeta de destino que se han agregado a la carpeta de origen y cambia los archivos que se han cambiado en la carpeta de origen pero NO elimina los archivos que se eliminaron de la carpeta de origen?

  • Si ese es el caso, ¿cuál es la mejor manera de hacer rsyncesto? Quiero que la carpeta de destino refleje perfectamente la carpeta de origen, y eso significa eliminar cualquier archivo que se haya eliminado de la carpeta de origen.

Veo algunas opciones enumeradas en la página del manual para rsynceso podría hacer el truco, pero como no estoy familiarizado.

usuario254251
fuente

Respuestas:

227

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

rsync -avh source/ dest/ --delete
GarethD
fuente
15
Asegúrese de que la fuente sea un directorio. Usar source/* dest/no funcionará.
Tom Saleeba
3
Encontré ese evento con --deleteo --delete-afterno se eliminará debido a algunos errores: "Error de E / S encontrado - omitiendo la eliminación del archivo". Para resolver esta --ignore-errorsopción de agregar y depurar los errores por separado
MHT
12
¡Funciona perfectamente! Aunque está funcionando, recomendaría SIEMPRE usar la -n, --dry-runopción, antes de ejecutar rsync, especialmente cuando se trata de opciones como estas ( --delete). Evitará cualquier posible dolor de cabeza :).
ivanleoncz
2
@MHT: Ninguna respuesta parece estar completa sin tu comentario.
Lonnie Best
2
@TheBicentennialMan -a implica -r .
x-yuri
45

El comando rsync no eliminará ningún archivo mientras use algunas de sus opciones deleteen ese comando. Entonces, si se agrega algún archivo o carpeta en la fuente, se sincronizará con el destino sin ninguna eliminación.

Le sugiero que use rsyncpara hacer copias de seguridad de los archivos de origen y use find ... rmpara eliminar archivos por un período de tiempo o tamaño de 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 desde la fuente y luego elimine todos los archivos cuya última modificación es de más de 2 meses.

ACTUALIZAR

Como encuentro que las deleteopciones son solo para TARGET que si algunos archivos se eliminan de la fuente, los rsync --deleteeliminan de TARGET. Y la deleteopción por 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 eliminan 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 solo en TARGET.

shgnInc
fuente
1
¡¡Gracias por la respuesta!! ¿Te refieres a una opción de "eliminar" para rsync? ¿Por qué no puedo usar la opción "eliminar" para rsync?
user254251
@ user254251, si usa eliminar, el comando rsync elimina inmediatamente los archivos. Pero en este caso hay más tiempo para cualquier error.
shgnInc
Si entiendo correctamente, está diciendo que debería separar la tarea de eliminación de la tarea rsync para evitar errores. Sin embargo, tengo una pregunta. La página del manual para rsync enumera algunas opciones que parecen servir para separar la tarea de eliminación ejecutándola antes o después de la tarea de copia. Por ejemplo, veo dos opciones llamadas --delete-before y --delete-after. ¿Rsync con estas opciones tendría el mismo efecto que el método que describió? Leí la descripción completa de cada opción en la página del manual, pero hay alguna información en las descripciones que no entiendo.
user254251
@ user254251, la respuesta se actualizó. No sé si hay una manera de eliminar archivos de TARGET por limitación de tiempo en rsync .
shgnInc
¡Gracias! Entonces, ¿crees que estoy a salvo de errores si simplemente uso la opción --delete-before? No estoy especificando un tiempo de espera, así que no debería tener que preocuparme si la etapa de eliminación de rsync retrasa la etapa de transferencia. rsync se ejecuta una vez al día y es tiempo suficiente para sincronizar los archivos de respaldo antes de la próxima sincronización, por lo que tampoco debería tener que limitar el tiempo de sincronización.
user254251
6

Este comando copiará los datos incrementales y los mantendrá sincronizados con el servidor remoto.

  1. Copiará solo datos incrementales.
  2. Se eliminará si se eliminó algún dato de la fuente.
  3. Se copiará nuevamente desde la fuente si se eliminan datos en el destino.
  4. Básicamente, este comando mantendrá ambos entornos sincronizados.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Ejemplo:

rsync -avWe ssh --delete-before /data [email protected]:/backup
rsync -avW --delete-before -e ssh /data [email protected]:/backup
Ganesh Ghube
fuente
2
Creo que -W hace que no se copien solo datos incrementales sino que siempre se copien archivos completos.
Tulains Córdova
Recibí este error al ejecutar este comando: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian
1

Si hay algún error durante una scync rsync, rsync no va a eliminar correctamente los archivos que debe tener, incluso si se ha utilizado --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 al sincronizar con un sistema de archivos no Linux. Cuando reemplacé --permscon --no-perms, esos errores se fueron y borrar trabajaron.

--permsestá bien cuando está sincronizando desde un sistema de archivos Linux a otro sistema de archivos Linux, pero si está sincronizando desde Linux a un sistema de archivos no Linux (como NTFS, FAT), --permscausa errores porque rsync no puede establecer permisos de Linux en un sistemas de archivos no linux . De nuevo, errores = no eliminar.

- Al sincronizar en una partición no-Linux, yo uso --no-permspara evitar los errores que el sabotaje --delete, --delete-aftero --delete-before.

Si aún recibe errores después de eso, y no puede descubrir cómo hacer que esos errores funcionen, 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á cosas que no están sincronizadas, pero no sincronizará ningún archivo. Entonces, debes sincronizar nuevamente después de esto. Ese comando se basa en esta respuesta , excepto que también agregué el --ignore-errorsargumento, por lo que eliminaría incluso si hay errores.

Lonnie Best
fuente
1
¡Gracias por el consejo! Soy el autor original de esta pregunta hace 5 años. Me alegro mucho de que hayas publicado esto, porque he estado planeando configurar la sincronización con un disco NTFS en un futuro próximo, y probablemente me habría encontrado con el error de permisos porque estaba planeando usar la opción "-a" para rsync, que sincroniza los permisos (entre otras cosas). Entonces agregué "--no-perms" a mis notas. Ahora planeo usar rsync -a --no-perms --delete-before. Tengo una pregunta: ¿no --delete-before evitaría problemas con la eliminación de archivos ejecutando la eliminación antes de la sincronización? Pensé que ese era su propósito.
user254251
@ user254251 - No estoy seguro. Supongo que dependerá de qué tan temprano realmente "elimine antes". Si de alguna manera encuentra un error antes de que comience la eliminación, está jodido. Mi consejo para ti es evitar NTFS siempre que puedas a menos que te gusten los dolores agudos en el culo :). NTFS a NTFS funciona bien. NTFS a Linix funciona bien. Evite "Sistema de archivos Linux" a "Sistema de archivos no Linux"; es demasiado difícil garantizar que la eliminación funcione correctamente. PUEDES lograr esto, pero decidí que no vale la pena el problema en lugar de simplemente formatear la unidad de destino como EXT4.
Lonnie Best