Copiando archivos en red ahorrando tráfico y tiempo

Hace poco he empezado a hacer el ciclo de sistemas, para compensar mi falta de titulación oficial en este aspecto, y me encontré con una situación que seguro que en más de una ocasión os habréis encontrado. Los apuntes se cuelgan en una unidad en red (y el acceso de Dropbox o Ubunte One está bloqueado por el proxy). Así pues, la solución más comoda es, evidentemente copiar dichos apuntes en un pendrive. Podía copiar la carpeta donde cuelgan dichos apuntes pero en dicha carpeta cuelgan apuntes de otras asignaturas en las que no estoy matriculado, siendo más o menos esta la estructura de la unidad en red
R-IANA

ASIGNATURA1

ASIGNATURA2

ASIGNATURA3

etc.

Para esto el comando cp (o su equivalente en el entorno gráfico) nos funciona perfectamente… el primer día…o la primera semana, pero después no pasaremos un tiempo precioso (sobre todo si la copia la haces a última hora como yo) copiando archivos que realmente ya tienes y no han sido modificados.

Y entonces me acordé de rsync que permite analizar previa a la copia si los archivos han sido modificados (basándose en la fecha de modificación del archivo y en su tamaño) y copiar solo aquellos que hayan cambiado.

Para ello me generé un script con un comando por línea para cada carpeta de la asignatura que me interesaba :

rsync -riav /media/ATEIS/iana/FH/ /media/Novo\ volume/apuntes/

y asi con cada una. El porqué de cada opción es sencillo: -r hace que copie recursivamente, -i me muestra un pequeño resumen, -a mantiene losé atributos del fichero y -v para que me vaya dando algo más información (realmente el -i y el -v no son imprescindibles)

Pero me encontré que algunos profesores habían colgado en sus carpetas algún software que se usaría en sus asignaturas, así que añadí el parámetro –exclude-from=/home/xavy/scripts/excludeapuntes , que apunta al archivo exclude apuntes donde incluí líneas que comenzaban por – (para excluir archivos de ese tipo) y un patrón de los archivos que no deseaba (en este caso *.iso, *.deb y *,exe)

Ahora ya todo funcionaba perfectamente, pero se me ocurrió rizar el rizo: rsync incluye, un algoritmo que analiza el interior del fichero, y pensé, por qué no hacer que copie solo la modificación de ese archivo (en lugar de copiar enteros los archivos que hayan sido cambiado). Asi pues le añadí el parámetro –no-whole-file, ya que por defecto rsync incluye aunque no se especifique la opción -W que hace precisamente lo contrario de lo que queria, es decir, hace que trate los ficheros como unidades indivisibles.

Ahora ya tenia la copia de solo lo que quería y de solo los trozos que se habían cambiado, pero seguí rizando el rizo rizado, y recordé que rsync además tiene una función de compresión, así que, ¿por qué no usarla? pues dicho y hecho, parámetro -z añadido.

Realmente podría haber rizado más la cosa y añadido la opción -c para que en lugar de fiarse de la fecha y tamaño del archivo para ver si este había cambiado, pasase un checksum para tener 100% seguro si había habido cambios, pero personalmente ya lo consideré excesivo… no creéis?

Espero que este caso práctico os haya dado una pista de las grandes bondades de rsync, y os haya aclarado alguna de sus opciones más frecuentes

2 comments for “Copiando archivos en red ahorrando tráfico y tiempo

Deja un comentario