Lo hice y lo entendí

El blog de Vicente Navarro
16 may

rsync siempre sincroniza ciertos ficheros. Ver los segundos de la fecha de un fichero.

Tengo una memoria USB de 8 GB en la que suelo sincronizar con rsync (Backups con rsync) algunos ficheros de mi ordenador principal que quiero llevar siempre conmigo.

Teóricamente, el rsync sólo debería de sincronizar aquellos ficheros que han cambiado con respecto a la sincronización anterior. Sin embargo, yo detectaba que ciertos ficheros (no todos) siempre eran sincronizados, incluso aunque ejecutara el rsync dos veces seguidas.

Este comportamiento puede ser fácilmente reproducido. Creo 5 ficheros, esperando un segundo de tiempo entre la creación de uno y del siguiente (ese segundo de diferencia es clave en el asunto, en breve se verá por qué):

$ for i in 1 2 3 4 5; do echo test > fichero$i; sleep 1; done

$ ll
total 20
-rw-r--r-- 1 vicente vicente 5 2009-05-16 10:09 fichero1
-rw-r--r-- 1 vicente vicente 5 2009-05-16 10:09 fichero2
-rw-r--r-- 1 vicente vicente 5 2009-05-16 10:09 fichero3
-rw-r--r-- 1 vicente vicente 5 2009-05-16 10:09 fichero4
-rw-r--r-- 1 vicente vicente 5 2009-05-16 10:09 fichero5

Nota: Fijémonos en que en la salida de ls no se ven los segundos; volveremos sobre ello más adelante.

Sincronizo los ficheros en una memoria USB por primera vez:

$ rsync -av /tmp/prueba_rsync /media/disk/
sending incremental file list
prueba_rsync/
prueba_rsync/fichero1
prueba_rsync/fichero2
prueba_rsync/fichero3
prueba_rsync/fichero4
prueba_rsync/fichero5

sent 374 bytes  received 111 bytes  970.00 bytes/sec
total size is 25  speedup is 0.05

Y la segunda vez (y todas las siguientes) que lo intento tras desmontar y volver a montar la memoria USB, ¡me volverá a sincronizar varios de los ficheros!:

$ rsync -av /tmp/prueba_rsync /media/disk/
sending incremental file list
prueba_rsync/
prueba_rsync/fichero1
prueba_rsync/fichero3
prueba_rsync/fichero5

sent 284 bytes  received 79 bytes  242.00 bytes/sec
total size is 25  speedup is 0.07

La clave del problema está en que la memoria USB está formateada en FAT o FAT32 y tal y como leemos en rsync FAQ: rsync recopies the same files, FAT sólo almacena para el tiempo de modificación de los ficheros, valores pares para los segundos; es decir, la precisión máxima es de 2 segundos:

Another common cause involves sending files to an Microsoft filesystem: if the file’s modified time is an odd value but the receiving filesystem can only store even values, then rsync will re-transfer too many files. You can avoid this by specifying the –modify-window=1 option.

Aunque a mí me parece algo muy curioso en lo que no me había fijado nunca, en la entrada de la Wikipedia para el sistema de ficheros FAT: File Allocation Table sí que aparece documentado en la caja lateral de características:

Date resolution 2 s

Así que si usamos la opción --modify-window=1, no volverá a sincronizar dichos valores porque al rsync le damos 1 segundo de margen para considerar los tiempos de modificación idénticos:

$ rsync -av --modify-window=1 /tmp/prueba_rsync /media/disk/
sending incremental file list
prueba_rsync/

sent 149 bytes  received 31 bytes  360.00 bytes/sec
total size is 25  speedup is 0.14

Por otro lado, en el ls anterior hemos visto que todos los ficheros tenían la hora 10:09. El comando ls por defecto no muestra los segundos. Con la opción --time-style podemos obtener la fecha en el formato deseado:

--time-style=STYLE
    with -l, show times using style STYLE: full-iso, long-iso,  iso,
    locale,  +FORMAT.   FORMAT is interpreted like ‘date’; if FORMAT
    is FORMAT1<newline>FORMAT2, FORMAT1 applies to non-recent  files
    and FORMAT2 to recent files; if STYLE is prefixed with ‘posix-’,
    STYLE takes effect only outside the POSIX locale

Por ejemplo:

$ ls -la --time-style=full-iso
total 36
drwxr-xr-x  2 vicente vicente  4096 2009-05-16 10:10:15.000000000 +0200 .
drwxrwxrwt 16 root    root    12288 2009-05-16 10:08:47.000000000 +0200 ..
-rw-r--r--  1 vicente vicente     5 2009-05-16 10:10:01.000000000 +0200 fichero1
-rw-r--r--  1 vicente vicente     5 2009-05-16 10:10:02.000000000 +0200 fichero2
-rw-r--r--  1 vicente vicente     5 2009-05-16 10:10:03.000000000 +0200 fichero3
-rw-r--r--  1 vicente vicente     5 2009-05-16 10:10:04.000000000 +0200 fichero4
-rw-r--r--  1 vicente vicente     5 2009-05-16 10:10:05.000000000 +0200 fichero5
$ ls -la --time-style="+%d-%m-%y %H:%M:%S"
total 36
drwxr-xr-x  2 vicente vicente  4096 16-05-09 10:10:15 .
drwxrwxrwt 16 root    root    12288 16-05-09 10:08:47 ..
-rw-r--r--  1 vicente vicente     5 16-05-09 10:10:01 fichero1
-rw-r--r--  1 vicente vicente     5 16-05-09 10:10:02 fichero2
-rw-r--r--  1 vicente vicente     5 16-05-09 10:10:03 fichero3
-rw-r--r--  1 vicente vicente     5 16-05-09 10:10:04 fichero4
-rw-r--r--  1 vicente vicente     5 16-05-09 10:10:05 fichero5

Ahora sí que podemos ver la hora exacta de creación de los ficheros con resolución de segundos y, efectivamente, vemos que se habían creado con un segundo de diferencia. También vemos que los ficheros que se volvían a copiar eran, justamente, los creados en un segundo impar.

En cambio, en la memoria USB formateada en FAT (tras desmontar y volver a montar) vemos que, efectivamente, todas las fechas de modificación se guardan con valores pares:

$ ls -la --time-style="+%d-%m-%y %H:%M:%S" /media/disk/prueba_rsync/
total 40
drwx------ 2 vicente root  4096 16-05-09 10:10:14 .
drwx------ 6 vicente root 16384 01-01-70 01:00:00 ..
-rwx------ 1 vicente root     5 16-05-09 10:10:00 fichero1
-rwx------ 1 vicente root     5 16-05-09 10:10:02 fichero2
-rwx------ 1 vicente root     5 16-05-09 10:10:02 fichero3
-rwx------ 1 vicente root     5 16-05-09 10:10:04 fichero4
-rwx------ 1 vicente root     5 16-05-09 10:10:04 fichero5

En Linux, para ver la hora de modificación de un fichero con resolución de segundos en la línea de comandos, podemos usar opciones especiales de ls. Si usamos GNOME, el Nautilus nos muestra también los segundos en la vista de lista de ficheros.

En Windows, para ver la hora con resolución de segundos, parece que está algo más difícil, porque el comando dir no proporciona ninguna opción para lograrlo. Sí que es posible con otras herramientas de terceros, como el programa shareware XDir:

C:\xdir> xdir "/Form=*t.*s *f *ar*aa*as*ah"
12:35:48.8890 C:\xdir\pad_file.xml 0100
12:30:12.133357 C:\xdir\XDir Manual.pdf 0100
12:26:20.126976 C:\xdir\XDir.exe 0100

El Explorador de Windows por defecto no muestra los segundos y no parece que haya forma de cambiarlo. Podemos ir fichero por fichero consultando sus propiedades del fichero para ver las fechas de creación, modificación y acceso completas, pero a veces nos dirá cosas como “Modificado hace 3 minutos” y no nos será de mucha ayuda:

Necesitaremos gestores de ficheros de terceros para poder obtener un listado de ficheros que muestre los segundos en las fechas.

:wq

Entradas relacionadas

22 Comentarios a “rsync siempre sincroniza ciertos ficheros. Ver los segundos de la fecha de un fichero.”

  • Maks3w dice:

    Un asunto similar también me pasa con la memoria USB y el maletín de Windows y es un verdadero peñazo en Windows ya que hay que ir fichero a fichero diciendo cual tiene que copiar y si resulta que como mi caso era el workspace de Eclipse son muuuuuuchos ficheros.

    • ¡Claro, con el maletín de Windows pasará algo parecido si no tiene en cuenta los 2s de resolución de FAT! Pero siendo el FAT de Microsoft, ya podrían haberlo tenido en cuenta…

  • ¡ Has vuelto ! ¡ Estás vivo !
    Me alegro de las dos. He continuado entrando a diario en tu blog con la esperanza que volverias.

    Animo, continua así.

    • ¡Hombre, muchas gracias por el apoyo! Ya siento haberte tenido con tanta incertidumbre ;-) .

      Sin embargo, ya comenté en Segundo aniversario del blog que esperaba que el número de entradas bajara mucho en los siguientes meses.

      Pero a pesar del bajón, de momento no hay ningún plan de abandonar esto por completo…

  • Sagman dice:

    Como siempre, una entrada excelente Super ;)

  • Tito dice:

    Gracias por seguir en la brecha.

    La forma que usaba para arreglar lo de las memorias FAT era calculando el MD4, con la opción -c (- -checksum). Para pocos ficheros sirve, para muchos, es más rápido copiar todo de nuevo.

    Saludos.

    • ¡Y a ti por seguir también ahí al otro lado!

      Pues sí, es buena idea usar la opción -c para evitar el problema:

      -c, --checksum              skip based on checksum, not mod-time & size

      Pero claro, calcular el checksum retrasará bastante el proceso. Espero que el --modify-time te ayude de ahora en adelante para acabar los rsync antes.

  • jvare dice:

    Interesante y bien documentado como siempre, y además útil pues cada vez usamos más las memorias usb.
    Por otro lado ánimo, no lo dejes, aunque está claro que un articulo bien documentado lleva su tiempo.

  • Javi dice:

    Justamente tenia este problema.
    Perfecto!!!

  • Robert dice:

    Como siempre unos estupendos post, sigue así.

    Mi granito de arena: si solo quieres ver los segundos sin formateos especificos de fecha, puedes usar un “simple” ls --full-time

  • felix dice:

    Que tal Súper Coco,

    Me parece bien interesante tu blog, tiene bastante información buena de compartir. De hecho estoy usando tus ejemplos de expresiones regulares en Bash, soy fanático y usuario de la consola de comandos y en especial de Bash.

    Por otro lado, en el for, siempre lo uso de la siguiente forma:

    for i in {1..5}; el resto; done

    Así pasa por 5 iteraciones.

    Gracias. Saludos.

    • ¡Gracias! ¡A mí también me encanta la línea de comandos!

      Respecto al for, tienes mucha razón en que esa es una forma mejor de escribirlo, pero no sé por qué, cuando son pocas iteraciones tengo costumbre de escribirlo así.

  • sitositos dice:

    hola! la verdad que he buscado mucho sobre el tema de sincronizar archivos, me he bajado muchos, pero no encuentro ninguno que haga lo que quiero. Lo que quiero es lo siguiente:
    - Poder sincronizar dos equipos con samba.
    Tan simple como eso, no encuentro ninguno que le pueda poner una ruta smb://…
    Me podreis ayudar? gracias de antemano y buenisima pagina.

    • Lo de smb:// es una cosa específica del escritorio GNOME y otros.

      Si montas el directorio Samba como se ha hecho siempre:

      mount -t cifs -o username=nombreusuario //sistema/carpetacompartida /puntodemontaje

      podrás usar dicho directorio sin problemas como si fuera local.

  • AlBundy dice:

    Me uno a los de arriba al decir: ¡¡Alegría, alegría, supercoco sigue vivo!! X-D

    2 meses y medio sin poder leer un artículo nuevo de Vicente se hace más largo que una travesía en el desierto.

    Ahora en serio, sólo desear que puedas compaginar tus compromisos de familia/amigos/trabajo con este blog. Somos muchos los que apreciamos tu labor.

  • Orlando dice:

    Muy buen post.

Trackbacks y pingbacks:

Tema LHYLE09, creado por Vicente Navarro