7 votes

ADB qui extrait des fichiers de /data/data échoue à cause de liens symboliques. Comment ignorer les liens symboliques dans l'extraction ADB ?

Je peux courir

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

ou

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

et cela fonctionne bien. Cependant, si j'essaie

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

Il échoue avec l'erreur :

adb : error : échec de la copie de '/data/data/com.xlythe.saolauncher/lib' vers ./com.xlythe.saolauncher/lib' : distant Aucun fichier ou répertoire de ce type

Cela arrive parce que le lib est en fait un lien symbolique vers /data/app-lib/com.xlythe.saolauncher

Maintenant, si je voulais seulement com.xlythe.saolauncher Je le ferais simplement en copiant à la main un dossier à la fois, mais je veux plutôt extraire toutes les données de la base de données. /data/data tout de suite.
J'ai donc besoin d'un moyen de dire à ADB de simplement ignorer les liens symboliques au lieu d'échouer la copie.
Des conseils ?

8voto

Gokul NC Points 1917

Méthode 1 :

Si vous êtes d'accord pour obtenir le fichier de sortie en tant que .tar essayez cette commande :

adb exec-out tar c données/données > données_backup.tar

Assurez-vous d'omettre le début / sur votre chemin. ( Fuente )

Méthode 2 :

Si vous voulez copier par fichier, utilisez le script suivant écrit par moi :

#!/bin/bash
## Run as: ./filename.sh <source_folder> <destination_folder>
## If no <destination_folder> is provided, it's stored in current directory.

location=$1
if [ -z "$2" ]
  then
    destination=.
else
  destination=$2
fi

## Find the full path of all the files in the given directory, and retrieve each file one by one

while read line
do
  ## Create the directory where the file will reside, by removing the filename alone from the fullpath.
  ## Thanks to https://stackoverflow.com/a/9022471/5002496
  mkdir -p $destination"${line%/*}"
  adb pull $line $destination$line
done <<< `adb shell find $location -type f`

## The find binary in Android doesn't seem to show symlinks when '-type f' option is used.
## Source: https://stackoverflow.com/a/16303559/5002496

Enregistrez-le sous adb_pull.sh , courir chmod 777 adb_pull.sh et l'exécuter comme :

./adb_pull.sh /data/data data_backup

Tout le contenu de /data/data de l'appareil Android sera stocké dans data_backup dossier.
( Nota : N'ESSAYEZ PAS spécifier le dossier source comme /data/data/ avec un supplément de / après le nom du dossier)

Testé et fonctionnant sur mon Ubuntu 17.04, en utilisant un appareil Android 7.1.
Remarque : Pour accéder à /data complètement via ADB, vous devez exécuter adb root . ( plus d'aide ..)

2 votes

+1 J'ai dû rejoindre ce site juste pour donner un upvote à cette réponse (Méthode 1) qui m'a vraiment aidé :)

1 votes

Créer un tar peut échouer à cause de la combinaison de stdout et stderr. Essayez adb shell 'tar -cf - data 2>/dev/null' | gzip -9 > backup.tar.gz à la place.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X