11 votes

ADB pull s'arrête après la première erreur

J'essaie de faire une copie complète de /sdcard de mon OnePlus 3T non enraciné à mon PC Windows.

Jusqu'à présent, j'ai essayé :

  • adb pull /sdcard/ C:\mylocalfolder\

    Cela fonctionne bien mais dès qu'il y a une erreur, le processus s'arrête, donc le processus de copie a été tronqué. L'erreur est due à un fichier contenant " :" dans le nom, il ne peut donc pas être copié sur Windows.


  • adb exec-out tar c sdcard > sdcard_backup.tar

    Cela ne fonctionne pas, il s'arrête immédiatement et crée un fichier corrompu de 4kb.


  • Copier les fichiers en utilisant Windows via le mode Transfert de données

    Windows s'arrête de calculer le temps de copie des fichiers.


Adb pull serait la solution idéale jusqu'à présent s'il y a un moyen de sauter/ignorer les erreurs pour qu'il puisse continuer à copier les fichiers, ou peut-être essayer de sauter les fichiers avec certains caractères.

J'ai essayé les deux versions d'Adb 1.0.32 et 1.0.41 (dernière version en date de juillet 2020).

Une suggestion ?

12voto

alecxs Points 3105

La citation est recommandée pour rendre plus clair les commandes qui seront exécutées sur le client et les pipes/redirections qui sont désignés pour être exécutés du côté de l'hôte. En principe, cette commande devrait fonctionner :

adb exec-out "tar -c /sdcard" > sdcard_backup.tar

Regardez le fichier corrompu de 4 kb. Vous verrez l'en-tête tar et le contenu du fichier. Il y a une chaîne de tête avant le début du fichier tar :

suppression du premier "/" des noms de membres

$ hexdump -C sdcard_backup.tar
00000000  72 65 6d 6f 76 69 6e 67  20 6c 65 61 64 69 6e 67  |removing leading|
00000010  20 27 2f 27 20 66 72 6f  6d 20 6d 65 6d 62 65 72  | '/' from member|
00000020  20 6e 61 6d 65 73 0a 73  64 63 61 72 64 00 00 00  | names.sdcard...|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  00 00 00 00 00 00 00 00  00 00 00 30 30 30 30 37  |...........00007|
00000090  37 37 00 30 30 30 30 30  30 30 00 30 30 30 30 30  |77.0000000.00000|
000000a0  30 30 00 30 30 30 30 30  30 30 30 30 30 30 00 30  |00.00000000000.0|
000000b0  30 30 30 30 30 30 30 30  30 30 00 30 31 34 37 35  |0000000000.01475|
000000c0  37 00 20 32 2f 73 74 6f  72 61 67 65 2f 73 65 6c  |7. 2/storage/sel|
000000d0  66 2f 70 72 69 6d 61 72  79 00 00 00 00 00 00 00  |f/primary.......|

problématique exec-out redirigera stdin et stderr. Au moins, évitez les messages d'erreur, ou encore mieux, attrapez stderr complètement

adb exec-out "tar -c sdcard" > sdcard_backup.tar
adb exec-out "tar -c sdcard 2> /dev/null" > sdcard_backup.tar

Notez que la première ligne est sautée / Répertoire racine dans la ligne de commande. Cette fois, un fichier tar de 4 kb est produit

$ hexdump -C sdcard_backup.tar
00000000  73 64 63 61 72 64 00 00  00 00 00 00 00 00 00 00  |sdcard..........|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000060  00 00 00 00 30 30 30 30  37 37 37 00 30 30 30 30  |....0000777.0000|
00000070  30 30 30 00 30 30 30 30  30 30 30 00 30 30 30 30  |000.0000000.0000|
00000080  30 30 30 30 30 30 30 00  30 30 30 30 30 30 30 30  |0000000.00000000|
00000090  30 30 30 00 30 31 34 37  35 37 00 20 32 2f 73 74  |000.014757. 2/st|
000000a0  6f 72 61 67 65 2f 73 65  6c 66 2f 70 72 69 6d 61  |orage/self/prima|
000000b0  72 79 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |ry..............|

ressemble à une archive tar saine. laissez tar fait son travail. Il révèle que le fichier est un lien symbolique.

$ tar -vtf sdcard_backup.tar
lrwxrwxrwx root/root         0 1970-01-01 01:00 sdcard -> /storage/self/primary

En mode de démarrage /sdcard est juste un lien symbolique vers /storage/emulated/0
en mode de récupération /sdcard est un montage lié de /data/media/0

tar ne traverse pas les liens symboliques par défaut, par conséquent la commande fonctionne en mode de récupération. pour le mode de démarrage, utilisez tar -h ou fournir le chemin du répertoire au lieu de son lien symbolique.

en outre, sur Windows cmd.exe peut ajouter des \r retour chariot pour chaque \n Par conséquent, évitez de diffuser des données en clair et utilisez plutôt un algorithme de compression qui ne produit aucun saut de ligne. gzip

adb exec-out "tar -ch sdcard | gzip" > sdcard_backup.tar.gz
adb exec-out "tar -c storage/emulated/0 | gzip" > sdcard_backup.tar.gz

Cette archive tarball peut être extraite à partir de tar car la plupart des implémentations de tar détecteront automatiquement et invoqueront gzip automatiquement.

$ tar -vtf sdcard_backup.tar.gz
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/Samsung/
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/Samsung/Music/

Pour Windows, nous pouvons utiliser 7-Zip comme programme de déballage alternatif, il gère la plupart des algorithmes de compression.

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