adb extrait plusieurs fichiers

87

Quelle est la meilleure façon d'extraire plusieurs fichiers en utilisant

adb pull

J'ai sur mes /sdcard/25 fichiers avec le nom suivant:

gps1.trace
gps2.trace
...
gps25.trace

Wildcard ne fonctionne pas:

adb pull /sdcard/gps*.trace .
hsz
la source
4
Je ne l'utilise pas adbmais à partir des documents pullpeut être utilisé pour extraire un répertoire entier ??? Si tel est le cas et que ce sont des fichiers générés par votre propre application, pourquoi ne pas les écrire dans un sous-répertoire tel que /sdcard/mygpsfilespuis utiliser adb pull /sdcard/mygpsfiles. Cela fonctionnerait-il?
Squonk
2
Alternativement, je viens d'essayer l'explorateur de fichiers dans la DDMSperspective de l'éclipse et j'ai pu sélectionner plusieurs fichiers à partir de ma carte SD et effectuer un pullsur eux. Si vous n'utilisez pas eclipse, DDMS est disponible en tant qu'outil SDK distinct.
Squonk
monitorla commande fonctionne très bien, devrait être dedans <sdkdir>/tools!
Santosh Kumar

Réponses:

141

Vous pouvez utiliser xargset le résultat de la adb shell lscommande qui accepte les caractères génériques. Cela vous permet de copier plusieurs fichiers. Malheureusement, la sortie de la adb shell lscommande comprend des caractères de contrôle de saut de ligne que vous pouvez supprimer à l'aide de tr -d '\r'.

Exemples:

adb shell 'ls sdcard/gps*.trace' | tr -d '\r' | xargs -n1 adb pull
adb shell 'ls /sdcard/*.txt' | tr -d '\r' | sed -e 's/^\///' | xargs -n1 adb pull
David Momenso
la source
en fait, ce sont des retours chariot qui doivent être filtrés, mais bonne idée sur une question obscure
Chris Stratton
4
Voici une version légèrement améliorée qui peut gérer les espaces dans les noms de fichiers: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth
FYI: Windows et DOS utilisent "\ r \ n" pour les paires retour chariot / saut de ligne (c'est-à-dire pas "\ n \ r").
BrainSlugs83
3
dans mon cas, il a échoué en essayant d'extraire les noms de fichiers (correctement obtenus) du répertoire racine de l'android, pour le résoudre, j'ai utilisé:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
Cela ne fonctionne pas en disant que tr n'est pas reconnu comme une commande interne ou externe
Suncatcher
101

adb pull peut recevoir un nom de répertoire au lieu de at file et il extraira le répertoire contenant tous les fichiers.

Tirez toutes vos traces gps dans / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Exemple de adb pullet adb pushde répertoires récursifs:

C:\Test>adb pull /data/misc/test/ .
pull: building file list...
pull: /data/misc/test/test1/test2/test.3 -> ./test1/test2/test.3
pull: /data/misc/test/test1/test2/test.2 -> ./test1/test2/test.2
pull: /data/misc/test/test1/test2/test.1 -> ./test1/test2/test.1
pull: /data/misc/test/test1/test.3 -> ./test1/test.3
pull: /data/misc/test/test1/test.2 -> ./test1/test.2
pull: /data/misc/test/test1/test.1 -> ./test1/test.1
pull: /data/misc/test/test.3 -> ./test.3
pull: /data/misc/test/test.2 -> ./test.2
pull: /data/misc/test/test.1 -> ./test.1
9 files pulled. 0 files skipped.
0 KB/s (45 bytes in 0.093s)

C:\Test>adb push . /data/misc/test/
push: ./test1/test2/test.3 -> /data/misc/test/test1/test2/test.3
push: ./test1/test2/test.2 -> /data/misc/test/test1/test2/test.2
push: ./test1/test2/test.1 -> /data/misc/test/test1/test2/test.1
push: ./test1/test.3 -> /data/misc/test/test1/test.3
push: ./test1/test.2 -> /data/misc/test/test1/test.2
push: ./test1/test.1 -> /data/misc/test/test1/test.1
push: ./test.3 -> /data/misc/test/test.3
push: ./test.2 -> /data/misc/test/test.2
push: ./test.1 -> /data/misc/test/test.1
9 files pushed. 0 files skipped.
0 KB/s (45 bytes in 0.062s)
Ofir Luzon
la source
3
@kakyo Cela fonctionne pour les sous-dossiers pour moi. vérifiez que vous avez la dernière ADB de google. (J'utilise la version 1.0.29)
Ofir Luzon
Oui, j'ai trouvé que cela fonctionne pour les dossiers non vides à la fin. J'avais des dossiers vides qui n'ont pas été extraits. Aussi, semble-t-il que "push" est non récursif?
kakyo
@kakyo J'ai ajouté la sortie d'un pull et push récursif à ma réponse. Vous avez raison sur les dossiers vides, ils ne sont pas tirés ou poussés.
Ofir Luzon
1
Attention: avec ADB pull, les fichiers perdent leur date de modification d'origine.
Stan le
3
@Stan: sauf si vous utilisez l'option "-a" comme dans "adb pull [-a] <remote> ... <local>", qui selon l'aide préserve l'horodatage et le mode du fichier.
Rusty Gear
27

./adb pull /sdcard <- échoue

./adb pull /sdcard/ <- fonctionne récursivement - notez la barre oblique de fin

Testé avec Nexus 5 et adb téléchargé en mars 2014.

Publier en tant qu'invité
la source
1
Pour moi, cela a fonctionné de manière récursive sans la barre oblique finale, version adb 1.0.32
Antonio
Je dois reprendre mon vote positif car @Antonio a raison.
Shayan le
8

L'analyse de la sortie de «ls» est généralement une mauvaise idée. Au lieu de cela, utilisez «trouver».

adb shell 'find /sdcard/ -name "gps*.trace" -print0' | xargs -0 -n 1 adb pull

Pourquoi vous ne devriez pas analyser la sortie de ls

Ismaël
la source
Sur ma machine, j'avais besoin d'utiliser le chemin complet vers adb, mais sinon, cela fonctionnait très bien!
Dan J
Cette réponse est en fait assez intelligente. Bon travail!
Darth Egregious
6

Même si la adb pullcommande a commencé à accepter le nom de dossier pour le paramètre distant, je préfère toujours utiliser la tarcommande. Il offre plus de flexibilité - permet des modèles de nom de fichier (à la fois inclure et exclure ), contrôle des liens symboliques, préserve les autorisations de fichier. Depuis Android 6.0, vous pouvez utiliser un fichier. Avant cela, vous deviez utiliser des outils tiers tels que busybox:

adb exec-out tar c sdcard/amazonmp3 > amazon.tar

Assurez-vous d'omettre le début /de votre chemin.

jeune enfant
la source
Oh, ça n'a pas marché. tar -tvf me dit que le résultat ne ressemble pas à une archive tar. Tant pis.
themuddler
Voie très forte! Mais le problème est que des erreurs / avertissements tels que "tar: suppression de '/' en tête des noms de membres" sont ajoutés au fichier de sortie. Je ne sais pas comment éliminer cela.
x'ES
Je reçois un fichier de 1,5 Ko sur la sortie.
Shayan le
5

J'ai créé ceci pour les boîtes Windows, il est très utile de transférer des fichiers en utilisant des caractères génériques sans monter le système de fichiers. Vous pouvez inclure ce script quelque part dans votre chemin env.

adbpull.bat

@echo off
setlocal enabledelayedexpansion
if %1.==. (
    echo Wilcard parameter is required.
    goto end
)
for /F "tokens=* USEBACKQ" %%F in (`adb shell ls %1`) do (
    set text=%%F
    set mfile=!text:~0,-1!
    adb pull "!mfile!"
)
:end
endlocal

Exemple: adbpull /sdcard/DCIM/Camera/IMG_2016*

cardéol
la source
3

L'extraction de répertoire est disponible sur les nouveaux outils Android. (Je ne sais pas à partir de quelle version il a été ajouté, mais il fonctionne sur le dernier ADT 21.1)

adb pull /sdcard/Robotium-Screenshots
pull: building file list...
pull: /sdcard/Robotium-Screenshots/090313-110415.jpg -> ./090313-110415.jpg
pull: /sdcard/Robotium-Screenshots/090313-110412.jpg -> ./090313-110412.jpg
pull: /sdcard/Robotium-Screenshots/090313-110408.jpg -> ./090313-110408.jpg
pull: /sdcard/Robotium-Screenshots/090313-110406.jpg -> ./090313-110406.jpg
pull: /sdcard/Robotium-Screenshots/090313-110404.jpg -> ./090313-110404.jpg
5 files pulled. 0 files skipped.
61 KB/s (338736 bytes in 5.409s)
Palani
la source
2

en s'appuyant sur la réponse de David, je trouve que c'est légèrement mieux:

adb shell ls /foo | tr -d '\r' | xargs -n1 adb pull

En plus d'être un caractère de moins à taper (gros problème), il ne convertit pas le -ren un espace. C'est une différence significative, comme si vous essayez de faire

adb shell ls /foo/myFile* | tr '\r' ' ' | xargs -i -n1 adb pull {} someDir

vous obtiendrez une erreur en disant

remote object '/foo/myFile1 ' does not exist

Au lieu de cela, vous pouvez le faire, ce qui fonctionnera:

adb shell ls /foo/myFile* | tr -d '\r' | xargs -i -n1 adb pull {} someDir 
FurieuxGeorge
la source
0

Les caractères génériques fonctionnent dans mon cas, j'ai utilisé le script simple suivant pour importer des images Whatsapp de mon appareil virtuel sur mon bureau

#! /bin/bash
mkdir -p ~/Pictures/Pictures_adb
rm -f ~/Pictures/Pictures_adb/*
cd ~/Pictures/Pictures_adb
adb root
adb shell 'cp /data/media/0/WhatsApp/Media/WhatsApp\ Profile\ Photos/* /sdcard/Pictures/;exit'
adb pull /sdcard/Pictures
mv ~/Pictures/Pictures_adb/Pictures/* ~/Pictures/Pictures_adb/
rmdir ~/Pictures/Pictures_adb/Pictures
cd
srinivasu u
la source
Vous utilisez des caractères génériques pour cp sur Android et non pour tirer sur l'hôte, c'est pourquoi cela fonctionne. Belle alternative, bien que la copie vers / sdcard / coûte de la mémoire supplémentaire et fuit des fichiers privés vers sdcard.
user905686
0

PowerShell:

adb shell ls /sdcard/gps*.trace | foreach {adb pull $_}

Sam est
la source
-3

Sous Android, il existe un dossier avec des autorisations associées! Certains dossiers appartiennent à un utilisateur root ou système.

Vous devriez changer les permissions de ces fichiers, dossiers avant de faire "adb pull".

Les commandes suivantes peuvent aider:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Tim Long
la source