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.