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이클립스 관점 에서 파일 탐색기를 사용해 보았고 내 sdcard에서 파일을 다중 선택하고 수행 할 pull수있었습니다. eclipse를 사용하지 않는 경우 DDMS는 별도의 SDK 도구로 사용할 수 있습니다.
Squonk

monitor명령이 잘 작동합니다 <sdkdir>/tools.
Santosh Kumar

답변:


141

와일드 카드를 허용 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

참고 : Windows 및 DOS는 캐리지 리턴 / 줄 바꿈 쌍에 "\ r \ n"을 사용합니다 (예 : "\ n \ r"아님).
BrainSlugs83

3
제 경우에는 그것을 해결하기 위해 안드로이드의 루트 디렉토리에서 (올바르게 얻은) 파일 이름을 가져 오지 못했습니다. 저는 다음을 사용했습니다.adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps

4
이 말을 작동하지 않습니다 그럴 필요는 내부 또는 외부 명령으로 인식되지 않습니다
Suncatcher

101

adb pull at file 대신 디렉토리 이름을받을 수 있으며 모든 파일이있는 디렉토리를 가져옵니다.

/ sdcard / gpsTraces에서 모든 GPS 추적을 가져옵니다.

adb pull /sdcard/gpsTraces/ . 

adb pulladb 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 그것은 나를 위해 하위 폴더에서 작동합니다. Google의 최신 ADB가 있는지 확인하십시오. (1.0.29 사용)
Ofir Luzon

예, 결국 비어 있지 않은 폴더에서 작동한다는 것을 알았습니다. 가져 오지 않은 빈 폴더가 있습니다. 또한 "푸시"가 비 재귀적인 것 같습니까?
kakyo

@kakyo 나는 재귀 적 풀의 출력을 추가하고 내 대답에 밀어 넣습니다. 빈 폴더에 대해 맞습니다. 가져 오거나 푸시되지 않습니다.
Ofir Luzon

1
주의 : ADB를 사용하면 파일이 원래 수정 된 날짜를 잃게됩니다.
Stan

3
@Stan : "adb pull [-a] <remote> ... <local>"에서와 같이 "-a"옵션을 사용하지 않는 한 도움말에 따라 파일 타임 스탬프 및 모드가 유지됩니다.
Rusty Gear

27

./adb pull /sdcard <-실패

./adb pull /sdcard/ <-재귀 적으로 작동합니다. 후행 슬래시에 유의하십시오.

2014 년 3 월 다운로드 된 Nexus 5 및 adb로 테스트되었습니다.


1
나를 위해 그것은 최종 슬래시없이 재귀 적으로 작동했습니다. adb 버전 1.0.32
Antonio

@Antonio가 정확하기 때문에 내 업 보트를 다시 가져와야합니다.
Shayan

8

'ls'의 출력을 구문 분석하는 것은 일반적으로 나쁜 생각입니다. 대신 '찾기'를 사용하십시오.

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

ls의 출력을 파싱하면 안되는 이유


내 컴퓨터에서 adb에 대한 전체 경로를 사용해야했지만 그렇지 않으면 훌륭하게 작동했습니다!
Dan J

이 대답은 실제로 꽤 똑똑합니다. 잘 했어!
Darth Egregious

6

adb pull명령이 원격 매개 변수에 폴더 이름을 받아들이 기 시작 했지만 여전히 tar명령 을 사용하는 것을 선호합니다 . 더 많은 유연성을 제공합니다. 파일 이름 패턴 ( includeexclude 모두 포함 ), symlink 제어, 파일 권한 유지를 허용합니다. Android 6.0부터는 내장 기능을 사용할 수 있습니다. 그 전에는 다음과 같은 타사 도구를 사용해야했습니다 busybox.

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

/경로 에서 선행을 생략 해야합니다.


오, 작동하지 않았습니다. tar -tvf는 결과가 tar 아카이브처럼 보이지 않는다고 알려줍니다. 오 잘.
themuddler 2013

아주 강한 길! 그러나 문제는 출력 파일에 추가 된 "tar : 멤버 이름에서 선행 '/'제거"와 같은 오류 / 경고입니다. 이것을 제거하는 방법을 모릅니다.
x'ES

출력에 1.5KB 파일이 있습니다.
Shayan

5

Windows 상자 용으로 만들었습니다. 파일 시스템을 마운트하지 않고 와일드 카드를 사용하여 파일을 전송하는 것이 매우 유용합니다. 경로 환경 어딘가에이 스크립트를 포함 할 수 있습니다.

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

David의 답변을 바탕으로 이것이 약간 더 나아졌습니다.

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

Android에서 cp에 와일드 카드를 사용하고 호스트에서 가져 오기에는 사용하지 않기 때문에 작동합니다. 좋은 대안이지만 / sdcard /로 복사하면 추가 메모리가 필요하고 개인 파일이 sdcard로 유출됩니다.
user905686

0

PowerShell :

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


-3

Android에는 관련 권한이있는 폴더가 있습니다! 일부 폴더는 루트 또는 시스템 사용자에게 속합니다.

"adb pull"을 수행하기 전에 해당 파일, 폴더의 권한을 변경해야합니다.

다음 명령이 도움이 될 수 있습니다.

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.