Sincronizar carpetas entre Android y PC
viernes, 22 de noviembre de 2013Para GNU/Linux. La idea es sencilla: un script BASH que mediante el uso de ADB (Android Debug Bridge) mantenga una o varias carpetas sincronizadas entre nuestro Android y el ordenador de tal manera que siempre dispongamos de una copia en nuestro disco duro y esta se realice de manera automática (sin más intervención manual que conectar el teléfono al USB para cargarlo) y rápida.
En el siguiente vídeo se ve como funciona y como la sincronización es bastante rápida.
Idealmente esto lo empecé para mantener a mano en el ordenador las fotografías y vídeos que grabo con mi móvil (un Android – HTC Wildfire S) pero en realidad nada impide que esto puede ser usado para sincronizar otros contenidos ó simplemente como un modo cómodo de traspasar archivos al teléfono habitualmente para usarlo como pendrive.
La alternativa más evidente a este uso de ADB para sincronizar dos carpetas sería el montaje del teléfono como unidad de disco duro externo y a continuación usar alguna aplicación como sync para la sincronización, pero hay un par de ventajas a favor de ADB abismales: en el tiempo que tarda el teléfono en desmontar y montar en el PC la nueva unidad como un disco duro de nuestro ordenador he acabado yo de transferir alrededor de 200 Mg de archivos. La velocidad de transferencia es idéntica pero la conexión en inmediata (un par de segundos. Actualmente mantengo sincronizados 15 carpetas que contienen 250 archivos. Desde que conecto el teléfono al USB y aparece el diálogo informando de «No es necesaria la sincronización» pasan aprox. 6 seg).
Además de la velocidad, al no estar la tarjeta del teléfono montada como un disco duro/pendrive se gana en seguridad frente a archivos corruptos o desmontajes inapropiados. Si tienes que irte de improviso simplemente desconectas el teléfono y te lo llevas.
El único engorro es instalar ADB que viene con el kit de desarrollo de Android distribuido por Google. Si no las tienes ya instaladas simplemente sigue los pasos que se indican en la sección «Descargar Android SDK«
Preparar el móvil
La única preparación o instalación en el teléfono móvil es dejar activa por defecto la depuración USB de tal manera que siempre que se conecte esté accesible de forma inmediata para la aplicación ADB. Para activar la depuración usb, en tu teléfono busca y activa: Ajustes->Aplicaciones->Desarrollo->Depuración USB
Preparar el PC
En tu ordenador la única tarea extraordinaria (si no has hecho todavía) es asegurar que el ejecutable de ADB está accesible para todo el sistema. En mi caso ADB está instalado en /usr/bin.
Identificar tu Android
A continuación necesitamos algunos datos con los que reconocer cuando nuestro teléfono ha sido conectado al USB del ordenador.
Conecta el móvil vía USB, abre una konsola/terminal y escribes dmesg. Verás algunas líneas de información detectando la conexión de un nuevo dispositivo USB. Busca la línea que indica idVendor y idProduct. Copia y guarda esa información en un archivo de texto para usarla a continuación.
Reglas para UDEV
UDEV es el servicio encargado en la mayoría de los Linux modernos de registrar y administrar la conexión de dispositivos al ordenador. Mediante un serie de reglas indicamos a UDEV que es lo que tiene que hacer cuando detecte que se ha conectado/desconectado tal o cual dispositivo.
Las reglas UDEV estan normalmente (en openSuse 11.3) en el directorio /etc/udev/rules.d. En dicho directorio veréis una lista de archivos de texto que configuran el comportamiento de UDEV. Para no alterar archivos de sistema ya existentes lo ideal es crear nuestro propio archivo (como root) conteniendo nuestras reglas personalizadas y a continuación situarla al final de la lista de archivos existentes simplemente asignándole un nombre único tal como «99-mis reglas.rules» que lo situa al final de la lista.
(todas las operaciones siguientes se realizan como administrador, sudo) Si ya tienes tu archivo de reglas personales edítalo, de lo contrario crea uno con la siguiente línea:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="XXXXX-ID-VENDOR", ATTRS{idProduct}=="XXXXX-ID-PRODUCT", ACTION=="add", RUN+="/bin/su mi-usuario -c '/home/mi-usuario/bin/sincro-movil'"
Reemplaza XXXX-ID-PRODUCT y XXXX-ID-VENDOR por los valores de tu dispositivo obtenidos en el paso anterior y mi-usuario por tu nombre de usuario.
En un terminal recarga las reglas conudevadm control --reload-rules
Probando la detección
Bien, vamos a comprobar que todo funciona como debe y que UDEV detecta y ejecuta el script correctamente, creamos un script que más tarde completaremos y lo guardamos con el nombre usado en el punto anterior (/home/mi-usuario/bin/sincro-movil) con el siguiente contenido:#!/bin/bash
Haz ejecutable el script (chmod +x /home/mi-usuario/bin/sincro-movil).
echo "Hola móvil" > /home/mi-usuario/Desktop/movil.conectado
Una vez hecho esto conecta tu teléfono al puerto USB, en un par de segundos debería aparecer en tu escritorio una archivo de texto llamado «móvil.conectado«. Si no es así comprueba las rutas de archivos, nombres de archivos, etc…
Una vez que tienes tu script creado, funcionando y ejecutado correctamente desde UDEV pasamos a llenarlo de contenido.
Script de sincronización
El script que utilizo para la sincronización podéis copiarlo/descargarlos desde aquí sincroMovil (txt).
Guardad el contenido como (p.ejem) sincroMovil en vuestra carpeta ~/bin (o donde le indicasteis en el paso anterior a UDEV) y hacedlo ejecutable (chmod +x ~/sincroMovil). Editadlo y corregid las líneas que requieren personalizarse, las carpetas que quereis sincronizar, etc…
En este vídeo podéis ver el script en funcionamiento. Tomar una foto de la pantalla, conectar el teléfono y tener la imagen en el escritorio en unos segundos.
Sincronización: Básicamente el script lo que hace es generar un par de listas de archivos para cada una de los directorios a sincronizar. Ambos archivos se guardan en local (por rendimiento) y bajo los nombres (personalizables) de sincro.list y sincro.list.remota. Cuando el script se ejecuta (porque UDEV ha detectado la conexión o bien lo lanzamos manualmente) se recrean de nuevo ambas lista y se comparan mediante DIFF. Este archivo de diferencias define si es necesario el copiado de archivos y la dirección del mismo (del teléfono al PC ó viceversa) o simplemente se emite un diálogo avisando de que no es necesaria la sincronización.
Borrado local: Antes de hacer esto el script comprueba si falta algún archivo en local desde la última sincronización (es decir, se ha borrado manualmente) y caso de detectar que falta algún archivo lo borra también en el teléfono. Pero no a la inversa. Es decir, si borramos un archivo en local se borrará en el teléfono en la siguiente sincronización, pero si lo borramos en el teléfono únicamente el fichero se volverá a copiar a este en cuanto lo enchufemos al PC.
He hecho esto así porque parece más cómodo eliminar imágenes y vídeos desde el escritorio que desde el teléfono. Tiene el inconveniente de que no podremos eliminar un archivo desde el teléfono si este se encuentra en una carpeta sincronizada ya que a cada conexión se volverá a copiar desde el PC. Esto en realidad no es un bug sino una feature. :D
Si queréis anular esta función de borrado basta con comentar la línea 156 del script.
Mejoras
La principal mejora a introducir sería el refresco de la caché del teléfono. Actualmente el teléfono no se entera de los cambios ocurridos en su sistema de archivos (al menos en las galerías de fotos que mantengo sincronizadas). Si borramos un archivo en local y sincronizamos las carpetas, el teléfono sigue mostrando la miniatura de una imagen que ya no existe y emite un error al tratar de abrirla.
Si enviamos algún archivo al teléfono no aparece en la lista hasta que la caché se refresca.
Debe haber alguna manera de forzar el refresco de la caché pero he sido incapaz de encontrarla. Se agradece cualquier información.
victorhck
#1/ 22 de November/2013 a 21:55:31
Otros comentarios de «victorhck»
eres un crack!! ;)
cio
#2/ 01 de December/2013 a 21:09:24
Otros comentarios de «cio»
una herramienta básica, gracias.
Trebol-a
#3/ 02 de December/2013 a 00:21:02
Otros comentarios de «Trebol-a»
No sé si básica, pero muy cómoda! :D
Gracias a los dos.
kamilo
#4/ 23 de January/2014 a 02:40:09
Otros comentarios de «kamilo»
Que bueno, lo intente hacer
Pero resulta que tengo un samsum 3 mini y uso linux mint y no me reconoce el teléfono? Hay algo que pueda hacer al respecto. De antemano mil gracias
Trebol-a
#5/ 23 de January/2014 a 10:00:10
Otros comentarios de «Trebol-a»
Hola Kamilo,
en el momento de conectar el teléfono al USB de tu PC deberías en un terminal hacer dmesg, eso te debería dar toda la información que necesitas de tu movil para construir la regla de udev. Si dmesg no registra ninguna información después de conectar el teléfono yo buscaría el fallo en la configuración del teléfono ó el USB de tu PC.
Que no reconozca el móvil es normal, que no lo detecte es otra cosa y es bastante más raro.
landeros
#6/ 31 de January/2014 a 19:17:31
Otros comentarios de «landeros»
tengo una duda sin querer elimine el archivo vold.fstab de mi android en la carpeta etc/ tengo un respaldo en la computadora del archivo vold.fstab puedo regresar el archivo a su lugar mediante los comandos ADB?
Trebol-a
#7/ 31 de January/2014 a 19:47:53
Otros comentarios de «Trebol-a»
Si estabas usando el script que comento arriba y tenías la carpeta /etc sincronizada con tu PC deberías tener una copia en un PC del archivo vold.fstab
gracias por el how.
#8/ 30 de March/2014 a 13:07:11
Otros comentarios de «gracias por el how.»
Hola y gracias por el how. Seguí todos los pasos y sincroniza los directorios pero no los archivos, o sea, sincroniza los directorios pero quedan vacíos y sale el comentario que "no hace falta la sincronización". A que puede ser debido? Gracias por la ayuda...
Trebol-a
#9/ 30 de March/2014 a 14:44:40
Otros comentarios de «Trebol-a»
Hola, pues podrían varios motivos, desde que la carpeta esté vacia jeje o llena de objetos ocultos (empiezan por . )...
Entra en alguna de esas carpetas que están vacias. En ella debe haber 2 archivos ocultos llamados ".sincro.list" y ".sincro.list.remota", el primero contiene los archivos que hay en local (debería estar vacio) y el segundo los archivos que hay en el teléfono (debería contener los archivos que tu querías y no se han copiado).
Si esto es así habría que averiguar porqué no se han copiado y el modo más sencillo es en un terminal hacer lo que hace el script:
adb pull /ruta/al/archivo/en/telefono .
Debería fallar y emitir el motivo del fallo (observa que la linea de arriba termina en PUNTO)
jesus
#10/ 30 de March/2014 a 18:40:24
Otros comentarios de «jesus»
Hola de nuevo. Pues seguí tu sugerimiento y el error que me tira la consola es que no existe el directorio, que no es correcta la ruta vamos!!
Como puedo saber la ruta exacta? Con el explorador del movil la ruta es "sdcard0/DCIM/100ANDRO" eso es la tarjeta externa y luego tiene una partición de la memoria interna que la usa como si fuese externa y la ruta desde el rootexplorer es: "sdcard0/DCIM/100ANDRO"
Mil gracias y un saludo.
Trebol-a
#11/ 30 de March/2014 a 18:46:14
Otros comentarios de «Trebol-a»
La ruta "sdcard/xxxxxx" es una ruta relativa y dependerá de donde esté el puntero, deberías usar absoluta "/sdcard/xxxx"
Para asegurarte la ruta correcta deberías entrar en tu movil con "adb shell"
Navegar por las carpetas que te interesen haciendo "cd nombre-carpeta" y cuando llegues a la que te interesa sincronizar haces "pwd" para obtener la ruta precisa.. pero vamos, casi seguro que es "/sdcard0/DCIM/100ANDRO"
jesus
#12/ 30 de March/2014 a 19:16:04
Otros comentarios de «jesus»
Hola, mil gracias, funciona perfecto!! En mi caso las rutas eran estas
"/sdcard/DCIM/100ANDRO"
"/storage/sdcard1/DCIM/100ANDRO"
Lo dicho, Muchísimas gracias, en mi caso funciona perfecto bajo openSUSE 13.1.
Salu2
Trebol-a
#13/ 30 de March/2014 a 19:37:49
Otros comentarios de «Trebol-a»
No hay mal que cien años dure!! ;)
Actualmente estoy usando un versión mejorada de script, pero no lo ha publicado por aquí porque requiere tener instalada la función FIND en el movil, osea requiere tenerlo ROOTEADO y con BUSYBOX instalado (creo que FIND no viene "de serie" en Android) y me gustaría colgarlo por aquí una versió que no requiera FIND en el movil, si no como esta versión primera se baste con LS.
De todas formas si quereis probarlo el sincromovil v.2 está aqui
jesus
#14/ 30 de March/2014 a 19:46:27
Otros comentarios de «jesus»
Hola de nuevo. Yo lo tengo root y puedo instalar el busybox que creo que no lo tengo. Y que mejoras trae esta versión?
Trebol-a
#15/ 30 de March/2014 a 20:23:53
Otros comentarios de «Trebol-a»
Hace lo mismo pero he limpiado un poco las funciones, mejorado los diálogos y he cambiando un poco el funcionamiento para que permita ahora borrar en ambos lados de la sincronización (este script solo permite borrar en PC, si borras en el teléfono al sincronizar lo que hace es restaurar en el teléfono el elemento borrado con la copia que había en PC. Esta versión nueva si borras en cualquiera de los lados se borra en el otro)
jesus
#16/ 30 de March/2014 a 20:27:41
Otros comentarios de «jesus»
Gracias!! Lo probaré... Salu2
jesus
#17/ 06 de April/2014 a 19:18:26
Otros comentarios de «jesus»
Hola. Probé la versión 2 pero no me funciona. Tengo el terminal root y busybox instalado pero no hace nada cuando conecto el móvil al pc. Seguro que hago algo mal, el tema de las rutas no es porque las he puesto igual. Además, no sale ningún dialogo, ni siquiera de fallo!! Salu2
Trebol-a
#18/ 06 de April/2014 a 23:55:52
Otros comentarios de «Trebol-a»
mmm, pero ¿si lo ejecutas manualmente funciona?
Si, digamos, lo tienes en tu /home/tu-usuario/bin/sincroMovil2 y en una consola haces escribes sincroMovil2 debería salir algo como:
sincronizando carpeta1
sincronizando carpeta2
sincronizando carpeta3
sincronizando carpetaxxxx
No?
jesus
#19/ 10 de April/2014 a 22:07:13
Otros comentarios de «jesus»
Hola. Cuando lo ejecuto en consola me dice que no hay nada que sincronizar pero ni siquiera crea las carpetas... Salu2
Trebol-a
#20/ 11 de April/2014 a 01:01:41
Otros comentarios de «Trebol-a»
No se me ocurre ahora que puede ser, tengo que probarlo en un Linux "virgen" porque probablemente esté yo dando por hecho algo que no está hecho.
Si en una consola, teniendo el móvil conectado, haces:
adb shell find .
(termina en punto), te lista correctamente el contenido del móvil ¿verdad?
jesus
#21/ 13 de April/2014 a 14:57:10
Otros comentarios de «jesus»
Efectivamente!! y se tira un buen rato... En fin, de momento me quedo con el primer script, gracias por tu tiempo y ayuda. Estoy a la espera de que publiques sincromovil2 definitivo. Un saludo.
lebezze
#22/ 23 de June/2014 a 03:10:09
Otros comentarios de «lebezze»
hola me podrias ayudar si querer borre el archivo vold que es el encargado de que me reconosca la sdcard.si me pudieras ayudar a saber que devo hacer para que me vuelva a reconocer la sdcar te lo agradeceria
18 de December, 2024 @ 14:06