Jak mogę pobrać WSZYSTKIE pliki z folderu obecnego na karcie SD

110

Mam folder na karcie SD jako: /mnt/sdcard/Folder1/Folder2/Folder3/*.jpg

Nazwa Folder1 i Folder2 pozostaje stała, a wewnątrz Folder2 mam Folder3, 4, 5 i tak dalej. Chcę pobrać wszystkie pliki jpeg zamiast wszystkich plików (jest ich więcej) za pomocą adb do mojego bieżącego katalogu na komputerze. .

Każdy folder ma inną liczbę plików jpeg i innych plików i próbowałem użyć tego:

adb pull mnt/sdcard/Folder1/Folder2/Folder/*.jpg .

Ale to nie zadziałało ... Więc uhmm jak adb wyciągnąć wszystkie pliki obecne w dowolnym folderze karty SD za pomocą jednego polecenia (jedno polecenie, ponieważ każdy folder ma inną liczbę plików)

riteshtch
źródło
Czy korzystasz z Linuksa czy Windowsa? Czy możemy to rozwiązać za pomocą prostego skryptu?
Jared Burrows
Hmm mam zainstalowany Android Developement Stuff na obu: Win7 i Ubuntu .. jeśli jest rozwiązanie dla obu, to dobrze i dobrze ..! Ale w rzeczywistości potrzebuję go tylko dla Ubuntu (zainstalowanego jako maszyna wirtualna) .. więc uhmm tak im na Ubuntu ..
riteshtch
czy możesz zaznaczyć poprawną odpowiedź na to pytanie?
Jared Burrows

Odpowiedzi:

143

Pojedynczy plik / folder przy użyciu pull:

adb pull "/sdcard/Folder1"

Wynik:

adb pull "/sdcard/Folder1"
pull: building file list...
pull: /sdcard/Folder1/image1.jpg -> ./image1.jpg
pull: /sdcard/Folder1/image2.jpg -> ./image2.jpg
pull: /sdcard/Folder1/image3.jpg -> ./image3.jpg
3 files pulled. 0 files skipped.

Określone pliki / foldery przy użyciu findfrom BusyBox:

adb shell find "/sdcard/Folder1" -iname "*.jpg" | tr -d '\015' | while read line; do adb pull "$line"; done;

Oto wyjaśnienie:

adb shell find "/sdcard/Folder1" - use the find command, use the top folder
-iname "*.jpg"                   - filter the output to only *.jpg files
|                                - passes data(output) from one command to another
tr -d '\015'                     - explained here: http://stackoverflow.com/questions/9664086/bash-is-removing-commands-in-while
while read line;                 - while loop to read input of previous commands
do adb pull "$line"; done;         - pull the files into the current running directory, finish. The quotation marks around $line are required to work with filenames containing spaces.

Skrypty zostaną uruchomione w górnym folderze i rekurencyjnie zejdą w dół i znajdą wszystkie pliki „* .jpg” i ściągną je z telefonu do bieżącego katalogu.

Jared Burrows
źródło
10
adb pull /sdcardwyciągnąć wszystko!
Ian Vaughan
@IanVaughan to polecenie, którego często używam i działa dla mnie, ale chciałbym, aby był sposób na wyciągnięcie wszystkiego z karty SD, ale wykluczenie jednej ze ścieżek podrzędnych
GµårÐïåñ
Zastanawiam się, czy Android ma tar? Prosta plandeka przez ADB umożliwiłaby bardzo precyzyjne pobieranie plików, metadanych, ale z wykluczeniami. Jeśli gzip / bzip2 również tam jest, to skompresowany brelok byłby dostępny :)
Mark K Cowan
W przypadku nowoczesnych wersji adbmożesz po prostu określić katalog, a narzędzie będzie rekursywnie pobierać wszystko za Ciebie
DirkyJerky
@ mark-k-cowan kopia zapasowa adb ze współdzieloną (sdcard) jest pełna błędów.
Smeterlink
72

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
1
Próbowałem tego, ale ściągnęło to tylko niektóre katalogi. Nie jestem pewien, jakie były jego kryteria.
acjay
2
Jeśli chcesz pobrać folder, którego właścicielem jest root , uruchom adbsesję root (za pomocą $ adb root).
MasterAM,
uruchom polecenie jako root, tak jak powiedział @MasterAM! działało bez problemu! Twoje zdrowie!
Migisha
@acjay Puste foldery są pomijane. Dotyczy to również folderów rekurencyjnych, które są ostatecznie puste. Np. /sdcard/folder1/folder2Spowoduje folder1to pominięcie, jeśli folder2jest puste i nie ma innych plików pod folder1.
MDMower
40

Spróbuj, podając ścieżkę, z której chcesz pobrać pliki, które właśnie otrzymałem z karty SD

adb pull sdcard/

NIE dawaj * upodobania, aby poszerzyć wyszukiwanie lub odfiltrować. np. adb pull sdcard / *. txt -> to jest nieprawidłowe.

po prostu daj adb pull sdcard /

Ilavarasan
źródło
To znacznie czystsze rozwiązanie. Jest semantycznie lepsza i zachowuje również strukturę katalogów.
Mike
11
Zwróć uwagę, że zakończenie / ma znaczenie .
adrin
Nie potrzebowałem końcowego ukośnika z wersją adb 1.0.40
Miserable Variable
6

Tak, po prostu użyj końcowego ukośnika, aby rekurencyjnie pobrać katalog. Działa dla mnie z Nexusem 5 i aktualną wersją adb (marzec 2014).

Publikowanie jako gość-gość
źródło
Nie potrzebowałem końcowego ukośnika z wersją adb 1.0.40
Miserable Variable
Potrzebowałem końcowego ukośnika na Android Debug Bridge w wersji 1.0.32 z Androidem Q na Google Pixel XL.
Rock Lee
2

W systemie Android 6 z ADB w wersji 1.0.32 musisz umieścić / za folderem, który chcesz skopiować. Na przykładadb pull "/sdcard/".

antymateria
źródło
Nie potrzebowałem końcowego ukośnika z wersją adb 1.0.40
Miserable Variable
1

jeśli używasz jellybean, po prostu uruchom cmd, wpisz urządzenia adb, aby upewnić się, że twój czytelny jest, wpisz adb pull sdcard / sdcard_ (data lub dodatkowa) <--- ten plik musi być wcześniej utworzony w katalogu adb. ZYSK!

W innych wersjach wpisz adb pull mnt / sdcard / sdcard_ (data lub extra)

Pamiętaj, aby utworzyć plik, albo będziesz miał bałagan, albo nie zadziała.

EDward
źródło
1

Jeśli chcesz pobrać katalog z ograniczonym dostępem z urządzenia zrootowanego, musisz ponownie uruchomić adb jako root: wpisz adb rootprzed ściągnięciem. W przeciwnym razie pojawi się komunikat o błędzieremote object '/data/data/xxx.example.app' does not exist

naXa
źródło