adb拉多个文件

时间:2012-06-17 20:47:32

标签: android adb

使用

提取多个文件的最佳方法是什么
adb pull

我的/sdcard/个25个文件名为:

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

通配符不起作用:

adb pull /sdcard/gps*.trace .

12 个答案:

答案 0 :(得分:127)

您可以使用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

答案 1 :(得分:88)

adb pull可以接收目录名而不是文件,它将拉出包含其中所有文件的目录。

在/ 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)

答案 2 :(得分:24)

./adb pull /sdcard< - 失败

./adb pull /sdcard/< - 以递归方式工作 - 记下尾部斜杠

使用2014年3月下载的Nexus 5和adb进行测试。

答案 3 :(得分:6)

我已经为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*

答案 4 :(得分:4)

ADBFS a FUSE Filesystem for Android Debug Bridge如果你使用的是linux或mac

答案 5 :(得分:4)

即使adb pull命令开始接受远程参数的文件夹名称,我仍然更喜欢使用tar命令。它提供了更大的灵活性 - 允许文件名模式(包括排除),符号链接控制,保留文件权限。从Android 6.0开始,您可以使用内置的。在此之前,您必须使用第三方工具,例如busybox

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

请务必省略路径中的前导/

答案 6 :(得分: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)

答案 7 :(得分:3)

从'ls'解析输出通常是一个坏主意。相反,请使用“查找”。

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

Why you shouldn't parse the output of ls

答案 8 :(得分:1)

根据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 

答案 9 :(得分:0)

Wild Card在我的情况下工作,我一直使用以下简单的脚本将我的虚拟设备的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

答案 10 :(得分:0)

PowerShell:

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

答案 11 :(得分:-2)

在Android中,有一些具有相关权限的文件夹!某些文件夹属于root用户或系统用户。

在执行" adb pull"之前,你们应该更改这些文件,文件夹的权限。

以下命令可能有所帮助:

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