adb ściąga wiele plików

87

Jaki jest najlepszy sposób na pobranie wielu plików przy użyciu

adb pull

Mam na swoich /sdcard/25 plikach o następującej nazwie:

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

Symbol wieloznaczny nie działa:

adb pull /sdcard/gps*.trace .
hsz
źródło
4
Nie używam, adbale z dokumentów pullmożna pobrać cały katalog ??? Jeśli tak jest i są to pliki wygenerowane przez Twoją własną aplikację, dlaczego nie zapisać ich w podkatalogu, takim jak, /sdcard/mygpsfilesa następnie użyj adb pull /sdcard/mygpsfiles. Czy to zadziała?
Squonk
2
Alternatywnie, właśnie wypróbowałem Eksplorator plików w DDMSperspektywie zaćmienia i byłem w stanie wybrać wiele plików z mojej karty SD i wykonać pullna nich. Jeśli nie używasz eclipse, DDMS jest dostępny jako oddzielne narzędzie SDK.
Squonk
monitorpolecenie działa świetnie, powinno być <sdkdir>/tools!
Santosh Kumar,

Odpowiedzi:

141

Możesz użyć xargsi wyniku adb shell lspolecenia, które akceptuje symbole wieloznaczne. Umożliwia to kopiowanie wielu plików. Irytująco wynik adb shell lspolecenia zawiera znaki sterujące przesuwem o wiersz, które można usunąć za pomocą tr -d '\r'.

Przykłady:

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
źródło
w rzeczywistości są to powroty karetki, które należy filtrować, ale słuszny pomysł w niejasnym problemie
Chris Stratton
4
Oto nieco ulepszona wersja, która może obsługiwać spacje w nazwach plików: github.com/sschuberth/dev-scripts/blob/master/android/ ...
sschuberth
FYI: Windows i DOS używają "\ r \ n" dla par powrót karetki / wysuw wiersza (tj. Nie "\ n \ r").
BrainSlugs83
3
w moim przypadku nie udało się wyciągnąć (poprawnie uzyskanych) nazw plików z katalogu głównego Androida, aby go rozwiązać, użyłem:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
Nie działa, mówiąc, że tr nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne
Suncatcher
101

adb pull może otrzymać nazwę katalogu zamiast at file i ściągnie katalog ze wszystkimi plikami w nim zawartymi.

Pobierz wszystkie ślady GPS w / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Przykład adb pulli adb pushkatalogów rekurencyjnych:

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
źródło
3
@kakyo To działa dla mnie w podfolderach. sprawdź, czy masz najnowszy ADB z google. (Używam 1.0.29)
Ofir Luzon
Tak, okazało się, że w końcu działa dla niepustych folderów. Miałem kilka pustych folderów, które nie zostały wyciągnięte. Wydaje się też, że „push” nie jest rekursywne?
kakyo
@kakyo Dodałem dane wyjściowe wyciągnięcia rekurencyjnego i wypchnięcia do mojej odpowiedzi. Masz rację co do pustych folderów, nie są one ciągnięte ani popychane.
Ofir Luzon
1
Uwaga: dzięki ADB pull pliki tracą oryginalną datę modyfikacji.
Stan
3
@Stan: chyba że użyjesz opcji "-a" jak w "adb pull [-a] <remote> ... <local>", która zgodnie z pomocą zachowuje znacznik czasu i tryb pliku.
Rusty Gear
27

./adb pull /sdcard <- niepowodzenie

./adb pull /sdcard/ <- działa rekurencyjnie - zwróć uwagę na końcowy ukośnik

Testowane z Nexusem 5 i adb pobranym w marcu 2014 r.

Publikowanie jako gość-gość
źródło
1
U mnie to działało rekurencyjnie bez końcowego ukośnika, wersja adb 1.0.32
Antonio
Muszę cofnąć mój głos za, ponieważ @Antonio ma rację.
Shayan
8

Przetwarzanie wyjścia z „ls” jest ogólnie złym pomysłem. Zamiast tego użyj „znajdź”.

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

Dlaczego nie powinieneś analizować wyjścia ls

Ismael
źródło
Na moim komputerze musiałem użyć pełnej ścieżki do adb, ale poza tym działało świetnie!
Dan J
Ta odpowiedź jest właściwie całkiem sprytna. Dobra robota!
Darth Egregious
6

Mimo że adb pullpolecenie zaczęło akceptować nazwę folderu dla parametru zdalnego, nadal wolę używać tarpolecenia. Zapewnia większą elastyczność - pozwala na wzorce nazw plików (zarówno włączanie, jak i wykluczanie ), kontrolę łączy symbolicznych, zachowuje uprawnienia do plików. Od Androida 6.0 możesz korzystać z wbudowanego. Wcześniej trzeba było używać narzędzi innych firm, takich jak busybox:

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

Pamiętaj, aby ominąć prowadzenie /na swojej ścieżce.

theuddler
źródło
Och, to nie zadziałało. tar -tvf mówi mi, że wynik nie wygląda jak archiwum tar. No cóż.
themuddler
Bardzo mocny sposób! Ale problemem są błędy / ostrzeżenia, takie jak „tar: usuwanie początkowego znaku '/' z nazw członków” dodawane do pliku wyjściowego. Nie wiem, jak to wyeliminować.
x'ES
Otrzymuję plik 1,5KB na wyjściu.
Shayan
5

Stworzyłem to dla skrzynek Windows. Bardzo przydatne jest przesyłanie plików przy użyciu symboli wieloznacznych bez montowania systemu plików. Możesz umieścić ten skrypt gdzieś w swojej ścieżce 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

Przykład: adbpull /sdcard/DCIM/Camera/IMG_2016*

Cardeol
źródło
3

Pobieranie katalogu jest dostępne w nowych narzędziach systemu Android. (Nie wiem, z której wersji został dodany, ale działa na najnowszym 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
źródło
2

opierając się na odpowiedzi Davida, uważam, że jest to nieco lepsze:

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

Oprócz tego, że wpisywanie jest o jeden znak mniej (wielka sprawa), nie konwertuje znaku -rna spację. To znacząca różnica, jakbyś próbował to zrobić

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

pojawi się błąd mówiąc

remote object '/foo/myFile1 ' does not exist

Zamiast tego możesz to zrobić, co zadziała:

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

Dzikie karty działają w moim przypadku, użyłem następującego prostego skryptu, aby zaimportować obrazy Whatsapp mojego urządzenia wirtualnego na mój pulpit

#! /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
źródło
Używasz symboli wieloznacznych dla cp na Androidzie, a nie do ściągania hosta, dlatego to działa. Dobra alternatywa, chociaż kopiowanie do / sdcard / kosztuje dodatkową pamięć i wycieka prywatne pliki na sdcard.
user905686
0

PowerShell:

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

Sam jest
źródło
-3

W systemie Android istnieje folder z powiązanymi uprawnieniami! Niektóre foldery należą do użytkownika root lub użytkownika systemu.

Powinniście zmienić uprawnienia do tych plików i folderów przed wykonaniem „adb pull”.

Pomocne mogą być następujące polecenia:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Tim Long
źródło