Hola a todos,foto de Eloy Mier Pérez

Bueno por aquí andamos de nuevo con los problemas típicos de un día de trabajo. Esto a nadie le importa hasta que uno de estos problemas nos salpica en lo profesional, lol.

El problema que traigo hoy es sobre cómo sincronizar carpetas del PC con mi pendrive. La gracia del asunto es que no tengo intención de usar software propietario.

Hasta la fecha, cuando llega la hora de salir del trabajo, tengo que perder mas de 10 minutos de mi precioso tiempo copiando toda la información del proyecto a mi pendrive, de forma que todos los días copio tanto la información que no ha sido modificada como la que si lo ha sido, repercutiendo muy negativamente en los tiempos de copia. Hasta el momento, no me había parado a pensar en la cantidad de tiempo que perdía con esta operación, hasta que hace unos días me surgió la pregunta ¿no existirá alguna de forma de copiar solo la información modificada en el día?, si ademas lo pudiese automatizar seria perfecto (pensaba para mi con una sonrisa pícara, jajajaja, !!pepino que me da un yuyu ¡¡).

Herramienta existente en Linux

Creo que la mayor parte de la gente que sigue el blog tiene ciertos conocimientos de Linux, y por lo tanto muy posiblemente y en base al problema planteado habrán pensado de forma directa en una herramienta ya existente en linux de nombre “rsync”. Pues efectivamente es en lo primero que yo pensé cuando me surgió el problema. Realmente lo primero que me vino a la cabeza fue : -¿por que esta mierda de SO no tiene algo similar al rsync de linux?-…bueno, la duda, hasta el momento, no la he podido resolver, así que ni corto ni perezoso, ¿por que no agregamos esa herramienta al SO que nos obligan a usar en los clientes?. El cómo hacerlo ya es otra historia, que ya que me he puesto, te voy a dar resuelta para que no tengas que pensar ni un minuto. La idea es la siguiente : si encontrásemos una especie de puente entre nuestra máquina Windows y un linux o una especie de linux, el cual pudiese ejecutar el rsync ¿quedaría resuelto nuestro problema?, pues bueno, si conseguimos que rsync ejecute desde luego es un avance muy importante, luego ya veremos como automatizamos el asunto ¿no os parece?

Pues tomando como base estas necesidades buscando un ratín por Inet me he encontrado con algo que nos va a solucionar el problema de nombre CYGWIN

¿Que es cygwin?

Bueno cygwin no es mas que un componente que proporciona las librerías POSIX básicas y el entorno que esos comandos necesitan para correr.

  1. Son una serie de herramientas que proporcionan un entorno look&feel Linux pero bajo Windows.
  2. Una librería dll (cygwin1.dll) que actúa como una capa Linux que proporciona una parte sustancial del API Linux.

Ojito (lo digo por los mas avispados) que cygwin NO es:

  1. Una forma para ejecutar aplicaciones nativas Linux en Windows.
  2. Un camino mágico por el que nuestras aplicaciones Windows incorporarán funcionalidades UNIX como señales, terminales, etc…
La instalación de Cygwin no es objetivo del presente artículo, pero si alguno de los lectores lo plantea se podría estudiar hacer un monográfico al respecto. De todas formas la instalación de dicho elemento no es para nada complicada. Simplemente se baja de inet el setup, se seleccionan los paquetes a instalar y ya esta. Por defecto la instalación la realiza en c:\cygwin quedando los homes de los usuarios en c:\cygwin\home. Para acceder a bash, simplemente podemos seleccionar el icono del escritorio o bien podemos ir por el menú de inicio, a selección del consumidor. A continuacion podeis ver bash en ejecución:

Arquitectura cygwin sobre Windows

Aquí se puede apreciar el diagrama de arquitectura que obtendremos tras la instalación de cygwin:

Como se puede apreciar en el gráfico de arquitectura se logra lo que estábamos buscando a través del componente llamado “cygwin1.dll”.

Arquitectura de la solución planteada

En el siguiente diagrama se puede apreciar un diagrama con la arquitectura de la solución planteada:

Como comentarios solo indicar al respecto que las unidades de la máquina se mapean en cygwin en la ubicación /cygdrive, por lo tanto si insertar un disco externo al que el sistema operativo asigna la unidad f: en cygwin esa unidad se corresponderá con /cygdrive/f

Primera de las soluciones

Bien el primero de los problemas que yo tenia era la sincronización de una unidad de red con una de las carpetas mi pendrive.

Por lo tanto ni corto ni perezoso me pongo con el script que me permite hacer dicha operación:

#!/bin/bash

echo comienza proceso de syncronizacion

origen=»/cygdrive/n/»
echo origen $origen

destino=»/cygdrive/f/P355.10/»
echo destino $destino

if [ -d $origen ]; then
if [ -d $destino ]; then
echo sinconizacion de $origen a $destino

#-v verbose mode
#-r recursivo
#-t mantener fechas de modificacion
#–delete borra de destino aquellos ficheros que no existen en origen
comando= rsync -vrt –delete $origen $destino
if [ $comando ]; then
echo «Syncronizacion fail…»
else
echo «Sincronizacion oK…»
fi

exit
else
echo Error no existe ruta destino $destino
exit 1
fi
else
echo Error no existe ruta origen $origen
exit 1
fi

Adjunto el script al articulo por si alguien lo quiere bajar. El nombre del fichero que le he dado al script es syncP355.10 y por supuesto le he dado los permisos de ejecución correspondientes. [download id=»35″]

Aquí podéis apreciar el funcionamiento del script usando una llamada directa usando el terminal bash de cygwin:

Integración con escritorio Windows

Bueno, ya hemos dado el primero de los pasos, un script sh con una llamada a rsync que ejecuta la sincronización correctamente.

Nota importante: La sincronización en este articulo significa llevarme la información de origen a la carpeta destino, eliminando de destino la información no existente en origen.

Siguiente paso, en el momento actual, cada vez que queremos sincronizar debemos abrir un terminal bash para posteriormente ejecutar nuestro script, lo que provocará la sincronización de las unidades involucradas. ¿Se podría escribir un bat (archivo de proceso por lotes) en nuestro WinEscritorio de forma que con un doble click haga la llamada por debajo al script de sincronización?¿como?

Bueno pues manos a la obra, ¿como llamamos?, me pongo a investigar sobre el binario bash proporcionado por cygwin. Si nos vamos a buscar el binario de bash podemos encontrarlo en c:\cygwin\bin. Si le pedimos ayuda mediante el comando bash.exe -c help obtenemos el retorno siguiente:

Bueno, tomando como base la información que nos da la salida del comando, ! Tenemos solucionado el asunto del paso de parámetros al bash ¡

La solución de llamada desde el WinEscritorio al script sh la pego a continuación:

C:
chdir C:\cygwin\bin
bash –login -i -c ./syncP355.10
pause

Estas líneas las metes en un fichero bat en Windows y doble clic para ejecutar, verás como la llamada al script se realiza sin problema. Te lo dejo preparado por si prefieres la descarga [download id=»36″]

Referencias:

Cygwin : http://cygwin.com/

Para la segunda parte del articulo dejo lo siguiente:

Incorporando nuevos orígenes / destinos (1ª solución)

Mejorando el script (parametrizado)

Saludos a todos y hasta la próxima.

Un saludo.

You must be logged in to post a comment.