7 votos

ADB extrayendo archivos de /data/data falla debido a los enlaces simbólicos. ¿Cómo omitir los enlaces simbólicos en ADB pull?

Puedo ejecutar

adb pull /data/data/com.xlythe.saolauncher/databases ./

o

adb pull /data/data/com.xlythe.saolauncher/files ./

y funciona bien. Sin embargo, si intento

adb pull /data/data/com.xlythe.saolauncher ./

Falla con el error:

adb: error: failed to copy '/data/data/com.xlythe.saolauncher/lib' to './com.xlythe.saolauncher/lib': remote No such file or directory

Esto sucede porque la carpeta lib es en realidad un enlace simbólico a /data/app-lib/com.xlythe.saolauncher

Ahora, si solo quisiera com.xlythe.saolauncher lo haría manualmente copiando una carpeta a la vez, pero en cambio deseo copiar todos los /data/data a la vez.
Entonces necesito una forma de indicarle a ADB que simplemente omita los enlaces simbólicos en lugar de fallar en la copia.
¿Alguna pista?

8voto

Gokul NC Puntos 34

Método 1:

Si estás de acuerdo en obtener el archivo de salida como un archivo .tar, prueba este comando:

adb exec-out tar c data/data > data_backup.tar

Asegúrate de omitir el / inicial en tu ruta. (Fuente)

Método 2:

Si deseas copiar archivo por archivo, utiliza el siguiente script escrito por mí:

#!/bin/bash
## Ejecutar como: ./nombrearchivo.sh  
## Si no se proporciona , se guardará en el directorio actual.

ubicacion=$1
if [ -z "$2" ]
  then
    destino=.
else
  destino=$2
fi

## Encuentra la ruta completa de todos los archivos en el directorio dado, y recupera cada archivo uno por uno

while read line
do
  ## Crea el directorio donde residirá el archivo, eliminando solo el nombre del archivo de la ruta completa.
  ## Gracias a https://stackoverflow.com/a/9022471/5002496
  mkdir -p $destino"${line%/*}"
  adb pull $line $destino$line
done <<< `adb shell find $ubicacion -type f`

## El binario find en Android no parece mostrar enlaces simbólicos cuando se usa la opción '-type f'.
## Fuente: https://stackoverflow.com/a/16303559/5002496

Guárdalo como adb_pull.sh, ejecuta chmod 777 adb_pull.sh y ejecútalo así:

./adb_pull.sh /data/data data_backup

Todos los contenidos de /data/data del dispositivo Android se almacenarán en la carpeta data_backup.
(Nota: NO especifiques la carpeta de origen como /data/data/ con un / adicional después del nombre de la carpeta)

Probado y funcionando en mi Ubuntu 17.04, utilizando un dispositivo Android 7.1.
Nota: Para acceder completamente a la partición /data a través de ADB, necesitas ejecutar adb root. (más ayuda..)

2 votos

+1 Tuve que unirme a este sitio solo para dar un voto positivo a esta respuesta (Método 1) que realmente me ayudó. :)

1 votos

Crear un archivo tar puede fallar debido a la combinación de stdout y stderr. En su lugar, prueba adb shell 'tar -cf - data 2>/dev/null' | gzip -9 > backup.tar.gz.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X