adb estrae più file


87

Qual è il modo migliore per estrarre più file utilizzando

adb pull

Ho sui miei /sdcard/25 file con il seguente nome:

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

Il carattere jolly non funziona:

adb pull /sdcard/gps*.trace .

4
Non lo uso adbma dai documenti pullposso essere utilizzato per estrarre un'intera directory ??? Se è così e si tratta di file generati dalla tua app, perché non scriverli in una sottodirectory come /sdcard/mygpsfilese quindi utilizzare adb pull /sdcard/mygpsfiles. Funzionerebbe?
— Squonk

2
In alternativa, ho appena provato File Explorer nella DDMSprospettiva di eclipse e sono stato in grado di selezionare più file dalla mia sdcard ed eseguire un pullsu di essi. Se non utilizzi eclipse, DDMS è disponibile come strumento SDK separato.
— Squonk

monitoril comando funziona alla grande, dovrebbe essere in <sdkdir>/tools!
— Santosh Kumar

Risposte:


141

È possibile utilizzare xargse il risultato del adb shell lscomando che accetta i caratteri jolly. Ciò ti consente di copiare più file. Fastidiosamente, l'output del adb shell lscomando include caratteri di controllo di avanzamento riga che puoi rimuovere utilizzando tr -d '\r'.

Esempi:

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

in realtà quelli sono ritorni a capo che devono essere filtrati, ma idea giusta su un argomento oscuro
— Chris Stratton

4
Ecco una versione leggermente migliorata che può gestire spazi nei nomi dei file: github.com/sschuberth/dev-scripts/blob/master/android/…
— sschuberth

FYI: Windows e DOS usano "\ r \ n" per le coppie di ritorno a capo / avanzamento riga (cioè non "\ n \ r").
— BrainSlugs83

3
nel mio caso non è riuscito a tentare di estrarre i nomi dei file (ottenuti correttamente) dalla directory principale di Android, per risolverlo ho usato:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
— rupps

4
Non funziona dicendo che tr non è riconosciuto come comando interno o esterno
— Suncatcher

101

adb pull può ricevere un nome di directory invece di at file e tirerà la directory con tutti i file al suo interno.

Estrai tutte le tue tracce gps in / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Esempio di adb pulle adb pushdi directory ricorsive:

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)

3
@kakyo Per me funziona per le sottocartelle. controlla di avere l'ultima versione di ADB di Google. (Sto usando 1.0.29)
— Ofir Luzon

Sì, ho scoperto che alla fine funziona per cartelle non vuote. Avevo delle cartelle vuote che non venivano estratte. Inoltre, sembra che "push" non sia ricorsivo?
— kakyo

@kakyo ho aggiunto l'output di un pull ricorsivo e push alla mia risposta. Hai ragione riguardo alle cartelle vuote, non vengono estratte o spinte.
— Ofir Luzon

1
Attenzione: con ADB pull i file perdono la data di modifica originale.
— Stan

3
@Stan: a meno che non usi l'opzione "-a" come in "adb pull [-a] <remote> ... <local>", che secondo la guida preserva il timestamp e la modalità del file.
— Rusty Gear

27

./adb pull /sdcard <- fallisce

./adb pull /sdcard/ <- funziona in modo ricorsivo - nota la barra finale

Testato con Nexus 5 e adb scaricato a marzo 2014.


1
Per me ha funzionato in modo ricorsivo senza la barra finale, versione adb 1.0.32
— Antonio

Devo riprendere il mio voto positivo perché @Antonio ha ragione.
— Shayan

8

L'analisi dell'output da "ls" è generalmente una cattiva idea. Utilizza invece "trova".

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

Perché non dovresti analizzare l'output di ls


Sulla mia macchina avevo bisogno di utilizzare il percorso completo di adb, ma per il resto funzionava benissimo!
— Dan J

Questa risposta è in realtà piuttosto intelligente. Buon lavoro!
— Darth Egregious

6

Anche se il adb pullcomando ha iniziato ad accettare il nome della cartella per il parametro remoto, preferisco comunque utilizzare il tarcomando. Fornisce maggiore flessibilità: consente modelli di nomi di file ( inclusi ed esclusi ), controllo del collegamento simbolico, preserva i permessi dei file. A partire da Android 6.0 è possibile utilizzare un file. Prima di allora dovevi usare strumenti di terze parti come busybox:

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

Assicurati di omettere l'inizio del /tuo percorso.


Oh, non ha funzionato. tar -tvf mi dice che il risultato non sembra un archivio tar. Oh bene.
— themuddler

Modo molto forte! Ma il problema sono errori / avvisi come "tar: rimozione iniziale '/' dai nomi dei membri" aggiunti al file di output. Non so come eliminarlo.
— x'ES

Ottengo un file di 1,5 KB sull'output.
— Shayan

5

L'ho creato per i box Windows, è molto utile per trasferire file usando i caratteri jolly senza montare il filesystem. Puoi includere questo script da qualche parte nel tuo percorso 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

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



3

Il pull della directory è disponibile sui nuovi strumenti Android. (Non so da quale versione sia stata aggiunta, ma funziona sull'ultimo 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)

2

basandosi sulla risposta di David, trovo che questo sia leggermente migliore:

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

Oltre ad essere un carattere in meno da digitare (grosso problema), non converte il -rin uno spazio. Questa è una differenza significativa, come se provassi a fare

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

riceverai un errore che dice

remote object '/foo/myFile1 ' does not exist

Invece puoi farlo, che funzionerà:

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

0

I caratteri jolly funzionano nel mio caso, ho utilizzato il seguente semplice script per importare le immagini Whatsapp del mio dispositivo virtuale sul desktop

#! /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

Usi i caratteri jolly per cp su Android e non per tirare sull'host, ecco perché funziona. Bella alternativa, anche se la copia su / sdcard / costa memoria extra e perde file privati ​​su sdcard.
— user905686

0

PowerShell:

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


-3

In Android, ci sono alcune cartelle con autorizzazioni associate! Alcune cartelle appartengono all'utente root o di sistema.

Ragazzi, dovreste cambiare i permessi di quei file, cartelle prima di fare "adb pull".

I seguenti comandi potrebbero aiutare:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.