adb extraer varios archivos

87

¿Cuál es la mejor manera de extraer varios archivos usando

adb pull

Tengo en mis /sdcard/25 archivos con el siguiente nombre:

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

El comodín no funciona:

adb pull /sdcard/gps*.trace .
hsz
fuente
4
No lo uso, adbpero de los documentos pullse puede usar para extraer un directorio completo. Si ese es el caso y estos son archivos generados por su propia aplicación, ¿por qué no escribirlos en un subdirectorio como /sdcard/mygpsfilesy luego usarlos adb pull /sdcard/mygpsfiles? Funcionaría eso?
Squonk
2
Alternativamente, acabo de probar el Explorador de archivos en la DDMSperspectiva de eclipse y pude seleccionar varios archivos de mi tarjeta SD y realizar una pullen ellos. Si no usa eclipse, DDMS está disponible como una herramienta SDK separada.
Squonk
monitorcomando funciona muy bien, debería estar en <sdkdir>/tools!
Santosh Kumar

Respuestas:

141

Puede utilizar xargsy el resultado del adb shell lscomando que acepta comodines. Esto le permite copiar varios archivos. Es molesto que la salida del adb shell lscomando incluya caracteres de control de avance de línea que puede eliminar usando tr -d '\r'.

Ejemplos:

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
fuente
en realidad, esos son retornos de carro que deben filtrarse, pero la idea correcta sobre un tema oscuro
Chris Stratton
4
Aquí hay una versión ligeramente mejorada que puede manejar espacios en los nombres de archivo: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth
FYI: Windows y DOS usan "\ r \ n" para pares de retorno de carro / avance de línea (es decir, no "\ n \ r").
BrainSlugs83
3
en mi caso, no pudo intentar extraer los nombres de archivo (obtenidos correctamente) del directorio raíz de Android, para resolverlo, usé:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
No funciona diciendo tr no se reconoce como un comando interno o externo
Suncatcher
101

adb pull puede recibir un nombre de directorio en lugar de un archivo y extraerá el directorio con todos los archivos en él.

Extraiga todos sus rastreos gps en / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Ejemplo de adb pully adb pushde directorios 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 Luzón
fuente
3
@kakyo Funciona para las subcarpetas para mí. compruebe que tiene la última versión de ADB de Google. (Estoy usando 1.0.29)
Ofir Luzon
Sí, descubrí que al final funciona para carpetas no vacías. Tenía algunas carpetas vacías que no fueron retiradas. Además, ¿parece que "push" no es recursivo?
kakyo
@kakyo He agregado la salida de un pull y push recursivo a mi respuesta. Tiene razón acerca de las carpetas vacías, no se tira ni se empuja.
Ofir Luzon
1
Cuidado: con ADB pull, los archivos pierden su fecha de modificación original.
Stan
3
@Stan: a menos que use la opción "-a" como en "adb pull [-a] <remote> ... <local>", que según la ayuda conserva la marca de tiempo y el modo del archivo.
Rusty Gear
27

./adb pull /sdcard <- falla

./adb pull /sdcard/ <- funciona de forma recursiva - observe la barra al final

Probado con Nexus 5 y adb descargado en marzo de 2014.

Publicando como invitado-invitado
fuente
1
Para mí funcionó de forma recursiva sin la barra final, adb versión 1.0.32
Antonio
Necesito retirar mi voto positivo porque @Antonio tiene razón.
Shayan
8

Analizar la salida de 'ls' es generalmente una mala idea. En su lugar, use 'buscar'.

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

Por qué no debería analizar la salida de ls

ismael
fuente
En mi máquina, necesitaba usar la ruta completa a adb, pero por lo demás, ¡esto funcionó muy bien!
Dan J
Esta respuesta es bastante inteligente. ¡Buen trabajo!
Darth Egregious
6

Aunque el adb pullcomando comenzó a aceptar el nombre de la carpeta para el parámetro remoto, todavía prefiero usar el tarcomando. Proporciona más flexibilidad: permite patrones de nombre de archivo (tanto de inclusión como de exclusión ), control de enlaces simbólicos, conserva los permisos de archivo. Desde Android 6.0 puede utilizar un archivo. Antes de eso, tenías que usar herramientas de terceros como busybox:

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

Asegúrese de omitir la guía /en su camino.

el tímido
fuente
Oh, no funcionó. tar -tvf me dice que el resultado no parece un archivo tar. Oh bien.
theuddler
¡Manera muy fuerte! Pero el problema son errores / advertencias como "tar: eliminando el '/' inicial de los nombres de los miembros" agregado al archivo de salida. No sé cómo eliminar esto.
x'ES
Obtengo un archivo de 1.5KB en la salida.
Shayan
5

He creado esto para cajas de Windows. Es muy útil transferir archivos usando comodines sin montar el sistema de archivos. Puede incluir este script en algún lugar de su ruta 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

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

cardeol
fuente
3

La extracción de directorios está disponible en las nuevas herramientas de Android. (No sé de qué versión se agregó, pero está funcionando en el ú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
fuente
2

basándose en la respuesta de David, encuentro que esto es un poco mejor:

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

Además de ser un carácter menos para escribir (gran cosa), no convierte el -ren un espacio. Esta es una diferencia significativa, como si intentara hacer

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

obtendrá un error diciendo

remote object '/foo/myFile1 ' does not exist

En su lugar, puede hacer esto, que funcionará:

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

Los comodines funcionan en mi caso, he estado usando el siguiente script simple para importar imágenes de Whatsapp de mi dispositivo virtual en mi escritorio

#! /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
fuente
Usas comodines para cp en Android y no para tirar del host, por eso funciona. Buena alternativa, aunque copiar a / sdcard / cuesta memoria extra y filtra archivos privados a sdcard.
user905686
0

Potencia Shell:

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

Sam es
fuente
-3

En Android, hay algunas carpetas con permisos asociados. Algunas carpetas pertenecen al usuario root o del sistema.

Ustedes deberían cambiar los permisos de esos archivos, carpetas antes de hacer "adb pull".

Los siguientes comandos podrían ayudar:

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