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.