93

使用拉取多个文件的最佳方法是什么

adb pull

我有/sdcard/以下名称的 25 个文件:

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

通配符不起作用:

adb pull /sdcard/gps*.trace .
4

13 回答 13

146

您可以使用接受通配符xargs的命令的结果。adb shell ls这允许您复制多个文件。令人讨厌的是,该adb shell ls命令的输出包含换行控制字符,您可以使用tr -d '\r'.

例子:

# Using a relative path
adb shell 'ls sdcard/gps*.trace' | tr -d '\r' | xargs -n1 adb pull
# Using an absolute path 
adb shell 'ls /sdcard/*.txt' | tr -d '\r' | sed -e 's/^\///' | xargs -n1 adb pull
于 2012-06-28T17:40:53.313 回答
105

adb pull可以接收目录名称而不是文件,它将提取包含所有文件的目录。

在 /sdcard/gpsTraces 中提取所有 gps 轨迹

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)
于 2012-10-01T18:15:43.127 回答
27

./adb pull /sdcard <-- 失败

./adb pull /sdcard/ <-- 递归工作 - 注意尾部斜杠

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

于 2014-03-11T10:58:10.367 回答
10

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

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

为什么你不应该解析 ls 的输出

于 2018-02-28T18:53:06.173 回答
6

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

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

确保省略/路径中的前导。

于 2013-02-18T10:57:54.297 回答
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*

于 2016-08-18T10:52:40.500 回答
4

如果您使用的是 linux 或 mac ,ADBFS 是一个用于 Android 调试桥的 FUSE 文件系统

于 2012-06-17T20:50:52.157 回答
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)
于 2013-03-09T17:48:51.020 回答
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 
于 2016-05-09T17:46:14.823 回答
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
于 2017-08-31T12:22:25.720 回答
0

电源外壳:

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

于 2020-10-29T16:54:01.633 回答
0

这可以使用adb exec-out. 例如,要获取今天的所有屏幕截图,您可以执行以下操作:

adb exec-out "cd /sdcard/Pictures/Screenshots; tar c Screenshot_20210907*" | tar x

这将传输临时 tar 存档中的所有文件并将其解压缩到您当前的工作目录。归功于https://stackoverflow.com/a/39429196/3347392

于 2021-09-07T14:44:00.023 回答
-3

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

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

以下命令可能会有所帮助:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
于 2015-05-21T21:28:54.447 回答