adb витягнути кілька файлів - -


87

Який найкращий спосіб отримати кілька файлів за допомогою

adb pull

У мене є /sdcard/25 файлів із таким ім’ям:

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

Підстановочний знак не працює:

adb pull /sdcard/gps*.trace .

4
Я не використовую, adbале з документів pullможна використовувати для витягування цілого каталогу ??? Якщо це так, і це файли, створені вашим власним додатком, то чому б не записати їх у підкаталог, такий як, /sdcard/mygpsfilesа потім використовувати adb pull /sdcard/mygpsfiles. Це спрацювало б?
Squonk

2
Як варіант, я щойно спробував Провідник файлів у DDMSперспективі затемнення і зміг багаторазово вибрати файли зі своєї SD-карти та виконати pullна них. Якщо ви не використовуєте eclipse, DDMS доступний як окремий інструмент SDK.
Squonk

monitorкоманда працює чудово, вона повинна бути <sdkdir>/tools!
Сантош Кумар,

Відповіді:


142

Ви можете використовувати xargsі результат adb shell lsкоманди, яка приймає символи підстановки. Це дозволяє копіювати кілька файлів. Набридливо вихід adb shell lsкоманди включає символи керування подачею рядків, які ви можете видалити за допомогою tr -d '\r'.

Приклади:

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

насправді це повернення кареток, які потрібно відфільтрувати, але правильна ідея щодо незрозумілого питання
Кріс Страттон,

4
Ось трохи вдосконалена версія, яка може обробляти пробіли в іменах файлів: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth

FYI: Windows і DOS використовують "\ r \ n" для пар каретка-повернення / подача рядка (тобто не "\ n \ r").
BrainSlugs83,

3
в моєму випадку він не намагається витягнути (правильно) , отримані імена файлів з кореневого каталогу андроїда, щоб вирішити цю проблему, я використовував:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps

4
Це не працює, кажучи, що tr не розпізнається як внутрішня чи зовнішня команда
Suncatcher

101

adb pull може отримати ім'я каталогу, а не файл, і він витягне каталог із усіма файлами в ньому.

Витягніть усі ваші gps-сліди в / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Приклад adb pullі adb pushрекурсивних каталогів:

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 Для мене це працює для вкладених папок. переконайтесь, що у вас найновіший ADB від Google. (Я використовую 1.0.29)
Офір Лузон

Так, я виявив, що це врешті-решт працює для непорожніх папок. У мене були порожні папки, які не витягнули. Крім того, здається, що "push" є нерекурсивним?
kakyo

@kakyo Я додав результат рекурсивного витягування та підштовхування до своєї відповіді. Ви маєте рацію щодо порожніх папок, їх не тягнуть і не штовхають.
Офір Лузон

1
Обережно: при витягуванні ADB файли втрачають початкову дату модифікації.
Стен

3
@Stan: якщо ви не використовуєте опцію "-a", як у "adb pull [-a] <remote> ... <local>", яка відповідно до довідки зберігає позначку часу та режим файлу.
Rusty Gear

27

./adb pull /sdcard <- не вдається

./adb pull /sdcard/ <- працює рекурсивно - зверніть увагу на кісну риску

Тестується на Nexus 5 та adb, завантаженому в березні 2014 року.


1
Для мене це працювало рекурсивно без остаточної косої риски, версія adb 1.0.32
Антоніо

Мені потрібно повернути свій голос за, тому що @Antonio правильний.
Шаян

8

Синтаксичний аналіз виводу з ls - це, як правило, погана ідея. Натомість використовуйте "знайти".

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

Чому ви не повинні аналізувати висновок ls


На моїй машині мені потрібно було використовувати повний шлях до adb, але в іншому випадку це спрацювало чудово!
Dan J,

Ця відповідь насправді досить розумна. Хороша робота!
Дарт

6

Незважаючи на те, що adb pullкоманда почала приймати ім'я папки для віддаленого параметра, я все одно вважаю за краще використовувати tarкоманду. Це забезпечує більшу гнучкість - дозволяє створювати шаблони імен файлів (як включати, так і виключати ), керування символічними посиланнями, зберігає дозволи файлів. З Android 6.0 ви можете використовувати вбудований. До цього вам доводилося використовувати сторонні інструменти, такі як busybox:

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

Обов’язково пропустіть провідне /на своєму шляху.


О, це не спрацювало. tar -tvf каже мені, що результат не схожий на архів tar. Ну добре.
themuddler

Дуже сильний спосіб! Але проблема полягає в помилках / попередженнях, таких як "tar: видалення провідних '/' з імен учасників", доданих у вихідний файл. Не знаю, як це усунути.
x'ES

На виході я отримую файл розміром 1,5 КБ.
Шаян

5

Я створив це для вікон Windows. Дуже корисно передавати файли за допомогою підстановних знаків без монтажу файлової системи. Ви можете включити цей сценарій десь у свій шлях 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

Приклад: adbpull /sdcard/DCIM/Camera/IMG_2016*



3

Витяг каталогів доступний на нових інструментах Android. (Я не знаю, з якої версії він був доданий, але працює над останньою версією 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

спираючись на відповідь Девіда, я вважаю, що це трохи краще:

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

На додаток до того, що він на один символ менше для набору (велика справа), він не перетворює його -rв пробіл. Це суттєва різниця, ніби ти намагаєшся це зробити

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

ви отримаєте повідомлення про помилку

remote object '/foo/myFile1 ' does not exist

Натомість ви можете зробити це, що буде працювати:

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

0

У моєму випадку працюють дикі картки, я використовую такий простий сценарій для імпорту зображень Whatsapp мого віртуального пристрою на робочий стіл

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

Ви використовуєте символи підстановки для cp на Android, а не для натягування хоста, тому це працює. Приємна альтернатива, хоча копіювання в / sdcard / коштує додаткової пам'яті та витікає приватні файли на sdcard.
user905686


-3

В Android є папка з відповідними дозволами! Деякі папки належать користувачеві root або системи.

Ви, хлопці, повинні змінити дозволи на ці файли, папки, перш ніж робити "adb pull".

Наступні команди можуть допомогти:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.