adb extrair vários arquivos

87

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 .
hsz
fonte
4
Eu não uso, adbmas a partir dos documentos pullpode 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/mygpsfilese usar adb pull /sdcard/mygpsfiles. Isso funcionaria?
Squonk
2
Como alternativa, acabei de experimentar o File Explorer na DDMSperspectiva do eclipse e fui capaz de selecionar vários arquivos do meu sdcard e executar um pullneles. Se você não usa o eclipse, o DDMS está disponível como uma ferramenta SDK separada.
Squonk
monitorcomando funciona muito bem, deve estar dentro <sdkdir>/tools!
Santosh Kumar

Respostas:

141

Você pode usar xargse o resultado do adb shell lscomando que aceita curingas. Isso permite que você copie vários arquivos. Irritantemente, a saída do adb shell lscomando 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
David Momenso
fonte
na verdade, esses são retornos de carro que devem ser filtrados, mas a ideia certa sobre um assunto obscuro
Chris Stratton
4
Esta é uma versão ligeiramente melhorada que pode lidar com espaços em nomes de arquivo: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth
FYI: Windows e DOS usam "\ r \ n" para pares de retorno de carro / alimentação de linha (ou seja, não "\ n \ r").
BrainSlugs83
3
no meu caso, falhou ao tentar puxar os nomes de arquivo (obtidos corretamente) do diretório raiz do android, para resolvê-lo, usei:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
Não adianta
Suncatcher
101

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 pulle adb pushde 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)
Ofir Luzon
fonte
3
@kakyo Isso funciona para subpastas para mim. verifique se você tem o ADB mais recente do google. (Estou usando 1.0.29)
Ofir Luzon
Sim, descobri que funciona para pastas não vazias no final. Eu tinha algumas pastas vazias que não foram retiradas. Além disso, parece que "push" não é recursivo?
kakyo
@kakyo Eu adicionei a saída de um pull e push recursivo para minha resposta. Você está correto sobre as pastas vazias, elas não são puxadas ou enviadas.
Ofir Luzon
1
Cuidado: com o pull do ADB, os arquivos perdem a data de modificação original.
Stan
3
@Stan: a menos que você use a opção "-a" como em "adb pull [-a] <remote> ... <local>", que de acordo com a ajuda preserva o timestamp e o modo do arquivo.
Rusty Gear
27

./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.

Postando como um convidado-convidado
fonte
1
Para mim, funcionou recursivamente sem a barra final, adb versão 1.0.32
Antonio
Preciso retomar meu voto positivo porque @Antonio está correto.
Shayan
8

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

Por que você não deve analisar a saída de ls

Ismael
fonte
Na minha máquina, precisei usar o caminho completo para o adb, mas por outro lado funcionou muito bem!
Dan J
Esta resposta é realmente muito inteligente. Bom trabalho!
Darth Egregious de
6

Mesmo que o adb pullcomando comece a aceitar o nome da pasta para o parâmetro remoto, ainda prefiro usar o tarcomando. 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.

pequeno
fonte
Oh, não funcionou. tar -tvf me diz que o resultado não parece um arquivo tar. Ah bem.
themuddler
Maneira muito forte! Mas o problema são erros / avisos como "tar: removendo '/' inicial dos nomes dos membros" adicionados ao arquivo de saída. Não sei como eliminar isso.
x'ES
Recebo arquivo de 1,5 KB na saída.
Shayan
5

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*

cardeol
fonte
3

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)
Palani
fonte
2

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 -rem 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 
FuriousGeorge
fonte
0

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
srinivasu você
fonte
Você usa curingas para cp no Android e não para pull no host, é por isso que funciona. Boa alternativa, embora copiar para / sdcard / custe memória extra e vaze arquivos privados para sdcard.
user905686
0

PowerShell:

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

Sam é
fonte
-3

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)
Tim Long
fonte