¿Cómo exactamente rsync decide qué sincronizar?

14

Estoy encontrando múltiples respuestas a la pregunta, así que quería preguntarle a las personas que realmente la usan, en lugar de solo querer hacer el blog más grande completando información aleatoria semi inútil.

Escenario: yo rsync -av --progress /dir/a /dir/b y hace lo suyo.

Agrego archivos nuevos a / dir / a y ejecuto el mismo comando nuevamente, sabe lo que hizo y solo copia los archivos nuevos.

Agrego nuevos archivos a / dir / a y cambio el nombre de algunos archivos en / dir / b, y tal vez también elimine algunos.

Si corro rsync -av --progress /dir/a /dir/bnuevamente, ¿qué se copiará? Solo los archivos nuevos porque sabe lo que ha copiado anteriormente, o los archivos que fueron renombrados / eliminados también, porque ya no están presentes.

Y como beneficio adicional, si los archivos copiados anteriormente se vuelven a copiar, ¿hay alguna manera de evitarlo, de modo que solo se copien las nuevas adiciones a / dir / a?

Por el momento, me complace comprobar las cosas manualmente, pero a medida que los datos crecen, necesitaré más automatización para realizar esta tarea.

SPooKYiNeSS
fuente
3
La -ibandera es muy útil. Para cada archivo, proporciona una cadena de coincidencia que se puede decodificar para ver por qué coincide (marca por tiempo de modificación,
marca

Respuestas:

17

Agrego archivos nuevos a / dir / a y ejecuto el mismo comando nuevamente, sabe lo que hizo y solo copia los archivos nuevos.

No, no sabe lo que hizo en una ejecución anterior. Compara los datos en el lado receptor con los datos que se enviarán. Con datos lo suficientemente pequeños, esto no será evidente, pero cuando tiene directorios lo suficientemente grandes, el tiempo dedicado a comparar antes de que comience la copia se siente fácilmente.

La verificación predeterminada es para tiempos y tamaños de modificación de archivos. De man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Y:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Tenga en cuenta que esto no está implícito en las opciones que utilizó. -aes:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times
muru
fuente
La mejor descripción que he visto (hasta ahora), gracias
SPooKYiNeSS
2
Una pequeña adición. Los archivos renombrados se tratan como archivos únicos en cada extremo. Si especifica --fuzzyuna vez, los reconocerá como iguales en el mismo directorio. Usar --fuzzydos veces expande esta capacidad a otras ubicaciones. Ver man rsyncpara más detalles. Por supuesto, una de las razones principales para usar rsynces su capacidad de copiar solo las partes de un archivo que han cambiado. Esto puede hacer transferencias a través de una red mucho más rápido. Por cierto, la opción de suma de comprobación se menciona anteriormente para su explicación de cómo rsyncfunciona. En la mayoría de los casos, no debe usarse.
Joe
6

General

Si entiendo correctamente, rsync -avno tiene memoria, por lo que también copiará los archivos que fueron renombrados / eliminados, porque están presentes en la fuente pero ya no están en el destino.

Consejos

  • Use la opción -n, 'ejecución en seco', para verificar qué sucede antes de ejecutar su rsynclínea de comando.

  • Observe el significado especial de una barra inclinada posterior al directorio de origen y vea la diferencia entre

    rsync -av --progress dir/a/ dir/b
    

    y

    rsync -av --progress dir/a dir/b
    

    que se describe en el manual man rsync.

Ejemplo

Su caso especial (agregar un archivo al directorio de origen 'a' y eliminar un archivo del directorio de destino 'b') agregará tanto el archivo agregado como el archivo copiado previamente, porque todavía está en el directorio de origen. Esto sucederá con y sin la opción -uy no conozco ninguna opción rsyncpara solucionarlo fácilmente, si desea mantenerlo en el directorio de origen.

Pero puede eliminarlo del directorio de origen o poner el nombre del archivo en el archivo excludedy usar la opción --exclude-from=excluded(para muchos archivos) o simplemente --exclude=PATTERNpara uno o unos pocos archivos.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternativa: unison

Es posible que desee probar la herramienta unison, que es una herramienta de sincronización . Proporciona un método visual para identificar casos especiales y decidir qué hacer. Hay una versión GUI ( unison-gtk).

sudodus
fuente
Buenos ejemplos gracias. Sabía lo / al final, solo estoy preguntando esto desde la aplicación, y lo perdí (y puedes ver claramente que acabo de copiar / publicar
SPooKYiNeSS
Y nuevamente se envía antes de que termine y no me deja editar mi comentario ... Copié / pegué el segundo. Voy a echar un vistazo a unuson y ver si se puede hacer lo que quiera, y si no voy a volver al plan B y acaba de hacer un script
SPooKYiNeSS
Lo he estado usando unison-gtkdurante varios años y estoy contento con eso. (Yo rsynctambién uso )
sudodus
1

Solo copia los nuevos archivos en / dir / a. Cualquier cosa que haga en / dir / b será ignorada, a menos que use la opción --delete. En ese caso, los archivos renombrados en / dir / b serán eliminados. Obligará a / dir / b a ser exactamente como / dir / a.

Sobre el bono, ¿quieres decir como en el caso de cambiar el nombre de los archivos en / dir / a, y luego rsyncing a / dir / b? No creo que haya una manera de evitar que rsync simplemente copie los archivos nuevamente en ese caso.

Hermann Ingjaldsson
fuente
No esperaba que hubiera una manera, aparte de usar un atributo para determinar, pero si estaba haciendo un script para niños y ya no sería necesario. Sin embargo, gracias por su respuesta, al menos ahora sé lo que debo hacer.
SPooKYiNeSS