亚行拉多个文件


86

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

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 2012年

2
另外,我只是DDMS从eclipse的角度尝试了File Explorer,并且能够从sdcard中多选文件并对其执行操作pull。如果您不使用Eclipse,则DDMS可作为单独的SDK工具使用。
Squonk 2012年

monitor命令效果很好,应该在<sdkdir>/tools
Santosh Kumar

Answers:


140

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

实际上,这些都是必须过滤的回车,但是在一个晦涩的问题上是正确的主意
Chris Stratton

4
:这里有一个略微改进的版本,可以在文件名中处理空格github.com/sschuberth/dev-scripts/blob/master/android/...
sschuberth

仅供参考:Windows和DOS对回车/换行符使用“ \ r \ n”(即不是“ \ n \ r”)。
BrainSlugs83 2014年

3
以我adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
为例

4
tr不被识别为内部或外部命令是行不通的
-Suncatcher

100

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

在/ 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 2012年

@kakyo我已将递归拉并推的输出添加到我的答案中。您对空文件夹是正确的,它们不会被拉出或推入。
Ofir Luzon

1
当心:使用ADB拉文件将丢失其原始修改日期。
Stan,

3
@Stan:除非您像在“ adb pull [-a] <远程> ... <local>”中那样使用“ -a”选项,否则根据帮助该选项将保留文件的时间戳和模式。
Rusty Gear

27

./adb pull /sdcard <-失败

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

经过Nexus 5和adb测试,2014年3月下载。


1
对我来说,它可以递归地工作而没有最后的斜杠,即adb版本1.0.32
Antonio

我需要收回我的投票,因为@Antonio是正确的。
Shayan


6

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

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

确保省略领导 /路径中。


哦,没用。tar -tvf告诉我结果看起来不像tar存档。那好吧。
themuddler

很强的方法!但是问题是在输出文件中添加了类似“ tar:从成员名称中删除开头的'/'之类的错误/警告。不知道如何消除这种情况。
x'ES

我在输出中得到1.5KB文件。
Shayan

5

我已经为Windows盒创建了此文件,使用通配符传输文件而不挂载文件系统非常有用。您可以在路径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

例: 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,而不用于主机上的pull,这就是它起作用的原因。不错的选择,尽管复制到/ sdcard /会占用额外的内存,并且会将私有文件泄漏到sdcard。
user905686 '18

0

电源外壳:

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


-3

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

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

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

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.