2010-06-25 12:29:20 +0000 2010-06-25 12:29:20 +0000
126
126

¿Cuáles son las diferencias entre las opciones de eliminación de rsync?

Veo en la página rsync man page que hay una serie de opciones delete, pero no entiendo bien las diferencias entre ellas. ¿Cuáles son las diferencias entre estas opciones?

--del an alias for --delete-during
 --delete delete extraneous files from dest dirs
 --delete-before receiver deletes before transfer (default)
 --delete-during receiver deletes during xfer, not before
 --delete-delay find deletions during, delete after
 --delete-after receiver deletes after transfer, not before
 --delete-excluded also delete excluded files from dest dirs

Respuestas (4)

125
125
125
2010-06-25 14:19:55 +0000
  • --del/--delete_during: Elimina los archivos del directorio de destino a medida que se copian (ahorra memoria en comparación con --delete-before: --delete-before hace un escaneo por separado para buscar archivos eliminables)

  • --delete: Elimina los archivos en el directorio de destino si no existen en el directorio de origen.

  • --delete-before: Elimina los archivos en el directorio de destino antes de copiar el archivo con el mismo nombre del directorio de origen

  • --delete-during: Borrar archivos en el directorio de destino MIENTRAS se copia el archivo-con-el-mismo-nombre del directorio de origen

  • --delete-delay: Marcar borra durante la transferencia, pero espera hasta que ésta se complete

  • --delete-after: El receptor borra después de la transferencia, no antes… Si alguna otra parte del rsync moviera archivos extra a otro lugar, querría esto en lugar de --delete-delay, porque --delete-delay decide lo que va a borrar en medio de la transferencia, mientras que --delete-after comprueba el directorio en busca de archivos que deban ser borrados DESPUÉS de que todo haya terminado.

  • --delete-excluded: Elimina los archivos del directorio de destino que están explícitamente excluidos de la transferencia del directorio de origen.

El objetivo de rsync no es copiar, es archivar. Esta es una distinción importante. El procesamiento de archivos borrados/modificados es crítico, y en muchos casos matizado.

La bandera --delete en particular es una de las que he visto fastidiar muchas veces. Mucha gente usa rsync para mover archivos a un almacenamiento de baja prioridad, y en este caso quieres que los archivos que estás moviendo todavía EXISTAN en el directorio de destino. Eso no es lo que hace delete: --delete se asegura de que, cuando borras un archivo del directorio de origen, también se borra del directorio de destino, para que éste no se llene de basura… Una vez vi a un tipo borrar su copia de seguridad al poner un nuevo disco, y no apagar su script rsync nocturno. El script vio que el directorio de origen estaba vacío, y borró todos los archivos del directorio de destino, para que coincidieran.

La mayoría de las otras opciones están relacionadas con el espacio o el rendimiento. El momento de borrar los archivos es importante si quieres asegurarte de que la transferencia es exitosa antes de hacer nada, pero si tu dispositivo es demasiado pequeño para manejar 2 copias de toda la información, necesitas borrar a medida que avanzas, etc. Es un poco extraño debido a su larga historia en múltiples plataformas: se han añadido algunas opciones para que la gente que estaba acostumbrada a ciertos comportamientos no se confundiera.

2
2
2
2013-01-17 18:50:20 +0000

Otro punto que vale la pena mencionar es que si su directorio de origen termina con /*, entonces rsync sólo considerará esos archivos y no el directorio en sí mismo (y por lo tanto la ausencia de archivos que desea eliminar en el destino).

Si estás especificando una opción de borrado arriba, pero rsync parece que no está borrando, entonces revisa para asegurarte de que no estás accidentalmente globeando y proporcionando una lista de archivos cuando quieres decir el directorio en sí.

2
2
2
2010-06-25 12:57:07 +0000

Están ocurriendo dos cosas:

  1. Quién hace el borrado
  2. Cuándo se produce

Puede ser el emisor o el receptor quien haga el borrado (no sé por qué esto es importante). Cuando ocurre

Tanto el emisor como el receptor pueden ser instruidos para hacer el borrado (no estoy seguro de por qué esto es importante). Así que cuando rsync desde un ordenador se conecta al servidor rsync en el otro lado, esto determina quién está emitiendo efectivamente el comando de borrado.

Cuando sucede es bastante fácil… antes significa que todos los archivos son borrados, y ENTONCES rsync copia los archivos. durante significa que mientras recorre la lista de archivos, los borra cuando llega a ellos, y después significa que espera hasta que todos los archivos son transferidos y entonces borra el lado remoto. Esto sólo importa cuando la transferencia se interrumpe.

0
0
0
2019-12-31 14:32:28 +0000

Por defecto, rsync no borra ningún archivo en el lado de destino. Para hacer que rsync borre archivos en absoluto, necesita usar al menos una de las opciones de borrado.

Si no le importa cuándo se borran los archivos, sólo tiene que utilizar --delete y dejar la elección a rsync. Puede combinar --delete con otras opciones de borrado (esto no entra en conflicto) pero no es necesario ya que todas las demás opciones de borrado ya implican --delete.

--delete-before funciona de la siguiente manera: rsync mira qué archivos están presentes en el origen y qué archivos están presentes en el destino, borra todos los archivos encontrados en el destino pero no en el origen y luego comienza la sincronización real. Esta orden es útil si el destino tiene poco espacio de almacenamiento, ya que primero liberará más espacio de disco en el destino antes de empezar a transferir cualquier archivo nuevo. La desventaja es que rsync requerirá más memoria para realizar la operación y toda la operación es un proceso de dos pasos y por lo tanto más lento.

--delete-during funciona como sigue: rsync comienza inmediatamente a sincronizar los archivos y cuando se encuentra con un archivo que sólo existe en el destino, lo elimina. De esta manera no hay penalización de velocidad y tampoco se requiere memoria adicional. El inconveniente es que puede ocurrir que primero se copien muchos archivos nuevos en los destinos antes de que se borren los archivos eliminados, por lo que el destino puede requerir mucho más espacio de almacenamiento en disco durante la operación que el que requiere al final una vez que se ha realizado toda la operación.

--delete-after funciona como sigue: Primero sincroniza todos los archivos, y luego realiza la misma operación que --delete-before realiza antes de la fase de sincronización. Esta es la peor opción en la mayoría de los casos, ya que requiere la mayor cantidad de memoria, la mayor cantidad de espacio en disco en el destino, y es más lenta al ser un proceso de dos pasos; básicamente combina todas las desventajas de los otros dos métodos. Esta opción existe principalmente para el caso de que se utilicen “archivos de fusión” (lo que son los archivos de fusión y cómo funcionan está fuera del alcance de esta respuesta). Dado que estos archivos pueden contener reglas para los archivos que deben excluirse durante el borrado, los nuevos archivos de fusión deben copiarse antes de la fase de borrado si su contenido debe considerarse durante la fase de borrado. A menos que sea un requisito, --delete-after no tiene ninguna ventaja.

--delete-delay es una opción bastante nueva (no está disponible en rsync 2.6.9, que sigue siendo la predeterminada en macOS 10.15, por ejemplo). Funciona como --delete-during, salvo que no borra los archivos inmediatamente sino después de la sincronización, por lo que es un híbrido de --delete-during y --delete-after. La ventaja es que es más rápido que --delete-after, la desventaja es que requiere más memoria durante la sincronización.

--delete-excluded le dice a rsync que no sólo borre los archivos que faltan en el origen, sino que también borre los archivos en el destino que fueron excluidos de la sincronización (--exclude o --exclude-from), independientemente de que estos archivos existan realmente en el origen o no.