Qual é a melhor maneira de extrair vários arquivos usando
adb pull
Tenho em meus /sdcard/
25 arquivos com o seguinte nome:
gps1.trace
gps2.trace
...
gps25.trace
O curinga não funciona:
adb pull /sdcard/gps*.trace .
Qual é a melhor maneira de extrair vários arquivos usando
adb pull
Tenho em meus /sdcard/
25 arquivos com o seguinte nome:
gps1.trace
gps2.trace
...
gps25.trace
O curinga não funciona:
adb pull /sdcard/gps*.trace .
DDMS
perspectiva do eclipse e fui capaz de selecionar vários arquivos do meu sdcard e executar um pull
neles. Se você não usa o eclipse, o DDMS está disponível como uma ferramenta SDK separada.
monitor
comando funciona muito bem, deve estar dentro <sdkdir>/tools
!
Respostas:
Você pode usar xargs
e o resultado do adb shell ls
comando que aceita curingas. Isso permite que você copie vários arquivos. Irritantemente, a saída do adb shell ls
comando inclui caracteres de controle de alimentação de linha que você pode remover usando tr -d '\r'
.
Exemplos:
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
adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
adb pull
pode receber um nome de diretório em vez de no arquivo e puxará o diretório com todos os arquivos nele.
Puxe todos os seus rastreamentos de GPS em / sdcard / gpsTraces
adb pull /sdcard/gpsTraces/ .
Exemplo de adb pull
e adb push
de diretórios recursivos:
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)
./adb pull /sdcard
<- falha
./adb pull /sdcard/
<- funciona recursivamente - observe a barra final
Testado com Nexus 5 e adb baixado em março de 2014.
Analisar a saída de 'ls' geralmente é uma má ideia. Em vez disso, use 'localizar'.
adb shell 'find /sdcard/ -name "gps*.trace" -print0' | xargs -0 -n 1 adb pull
Mesmo que o adb pull
comando comece a aceitar o nome da pasta para o parâmetro remoto, ainda prefiro usar o tar
comando. Ele fornece mais flexibilidade - permite padrões de nome de arquivo (tanto incluir como excluir ), controle de link simbólico, preserva permissões de arquivo. Desde o Android 6.0 você pode usar um built-in. Antes disso, você precisava usar ferramentas de terceiros como busybox
:
adb exec-out tar c sdcard/amazonmp3 > amazon.tar
Certifique-se de omitir a liderança /
em seu caminho.
Eu criei isso para caixas do Windows, é muito útil para transferir arquivos usando curingas sem montar o sistema de arquivos. Você pode incluir este script em algum lugar em seu env de caminho.
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
Exemplo:
adbpull /sdcard/DCIM/Camera/IMG_2016*
ADBFS, um sistema de arquivos FUSE para Android Debug Bridge se você estiver usando Linux ou Mac
O pull de diretório está disponível em novas ferramentas do Android. (Não sei de qual versão foi adicionado, mas está funcionando no último 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)
com base na resposta de David, acho que isso é um pouco melhor:
adb shell ls /foo | tr -d '\r' | xargs -n1 adb pull
Além de ser um caractere a menos para digitar (grande coisa), ele não converte o -r
em um espaço. Esta é uma diferença significativa, como se você tentasse fazer
adb shell ls /foo/myFile* | tr '\r' ' ' | xargs -i -n1 adb pull {} someDir
você obterá um erro dizendo
remote object '/foo/myFile1 ' does not exist
Em vez disso, você pode fazer isso, o que funcionará:
adb shell ls /foo/myFile* | tr -d '\r' | xargs -i -n1 adb pull {} someDir
Os curingas funcionam no meu caso, tenho usado o seguinte script simples para importar imagens do Whatsapp do meu dispositivo virtual para o meu 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
No Android, existem algumas pastas com permissões associadas! Algumas pastas pertencem ao usuário root ou do sistema.
Vocês devem alterar as permissões desses arquivos, pastas antes de fazer "adb pull".
Os seguintes comandos podem ajudar:
adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
adb
mas a partir dos documentospull
pode ser usado para puxar um diretório inteiro ?? Se for esse o caso e esses arquivos forem gerados pelo seu próprio aplicativo, por que não gravá-los em um subdiretório como/sdcard/mygpsfiles
e usaradb pull /sdcard/mygpsfiles
. Isso funcionaria?