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:
- Date Modified to show time with Seconds
- Explorer Cannot Show A File Date (e.g., Modified or Created) to the Second?
Necesitaremos gestores de ficheros de terceros para poder obtener un listado de ficheros que muestre los segundos en las fechas.
:wq
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…
Como siempre, una entrada excelente Super
¡Gracias!
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:Pero claro, calcular el checksum retrasará bastante el proceso. Espero que el
--modify-time
te ayude de ahora en adelante para acabar losrsync
antes.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.
¡Gracias por los ánimos!
Justamente tenia este problema.
Perfecto!!!
¡Me alegro de que te haya sido útil! ¡Así sí que da gusto, cuando ves que lo que escribe tiene utilidad inmediata
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
Tienes mucha razón. Mientras preparaba la entrada vi esa opción y se me ha olvidado comentarla. Muchas gracias por la contribución.
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í.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.
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.
Muchas gracias por tus amables comentarios. Así sí que da gusto escribir
.
¡Procuraremos seguir en la brecha!
Muy buen post.