【问题标题】:adb pull multiple filesadb 拉取多个文件
【发布时间】:2012-06-17 20:47:32
【问题描述】:

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

adb pull

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

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

通配符不起作用:

adb pull /sdcard/gps*.trace .

【问题讨论】:

  • 我不使用adb,但从文档中pull 可以用来拉整个目录???如果是这种情况并且这些文件是由您自己的应用程序生成的,那么为什么不将它们写到诸如/sdcard/mygpsfiles 之类的子目录中,然后使用adb pull /sdcard/mygpsfiles。这行得通吗?
  • 另外,我刚刚在 Eclipse 的 DDMS 透视图中尝试了文件资源管理器,并且能够从我的 sdcard 中多选文件并对它们执行 pull。如果您不使用 eclipse,DDMS 可作为单独的 SDK 工具使用。
  • monitor 命令效果很好,应该在<sdkdir>/tools

标签: android adb


【解决方案1】:

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

【讨论】:

  • 实际上那些是必须过滤的回车,但是在一个晦涩的问题上是正确的想法
  • 这里有一个稍微改进的版本,可以处理文件名中的空格:github.com/sschuberth/dev-scripts/blob/master/android/…
  • 仅供参考:Windows 和 DOS 使用“\r\n”表示回车/换行对(即不是“\n\r”)。
  • 在我的情况下,它试图从 android 的根目录中提取(正确获得的)文件名失败,为了解决它,我使用了:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
  • tr不被识别为内部或外部命令是行不通的
【解决方案2】:

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)

【讨论】:

  • @kakyo 它确实适用于我的子文件夹。检查你有来自谷歌的最新亚行。 (我使用的是 1.0.29)
  • 是的,我发现它最终适用于非空文件夹。我有一些没有被拉出的空文件夹。另外,“push”似乎是非递归的?
  • @kakyo 我已经添加了递归拉取的输出并推送到我的答案。您对空文件夹是正确的,它们不会被拉或推。
  • 注意:使用 ADB 拉取文件会丢失其原始修改日期。
  • @Stan:除非您使用“-a”选项,如“adb pull [-a] ... ”,根据帮助保留文件时间戳和模式。
【解决方案3】:

./adb pull /sdcard

./adb pull /sdcard/

在 2014 年 3 月下载的 Nexus 5 和 adb 上测试。

【讨论】:

  • 对我来说,它递归地工作,没有最后的斜线,adb 版本 1.0.32
【解决方案4】:

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

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

Why you shouldn't parse the output of ls

【讨论】:

  • 在我的机器上,我需要使用 adb 的完整路径,否则效果很好!
【解决方案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*

【讨论】:

    【解决方案6】:

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

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

    确保省略路径中的前导 /

    【讨论】:

    • 哦,没用。 tar -tvf 告诉我结果看起来不像 tar 存档。哦,好吧。
    • 非常强大的方式!但问题是诸如“tar:从成员名称中删除前导'/'”之类的错误/警告添加到输出文件中。不知道如何消除。
    • 我在输出中得到 1.5KB 的文件。
    【解决方案7】:

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

    【讨论】:

    • 不幸的是,我正在使用带有 Cygwin 的 Windows。但我必须记住这个 - 非常有趣的解决方案!
    【解决方案8】:

    目录拉取可用于新的 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)
    

    【讨论】:

      【解决方案9】:

      在大卫的回答基础上,我发现这稍微好一点:

      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 
      

      【讨论】:

        【解决方案10】:

        通配符适用于我的情况,我一直在使用以下简单脚本将我的虚拟设备的 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。
        【解决方案11】:

        PowerShell:

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

        【讨论】:

          【解决方案12】:

          这可以使用adb exec-out。例如,要获取今天的所有屏幕截图,您可以:

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

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

          【讨论】:

            【解决方案13】:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-06
              • 2014-12-17
              • 2018-12-12
              • 1970-01-01
              • 2020-01-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多