adb pull multiple files

What is the best way to pull multiple files using

adb pull

I have on my /sdcard/ 25 files with following name:

  • Java (Android) WebSocket Client Libraries
  • How do you include a username when storing email and password using Firebase (BaaS) in an Android app?
  • Android Studio Commit&Push bug
  • How to get BSSID of all wifi access points?
  • Android Polymorphism: Anti-Pattern?
  • Firebase Admin NoClassDefFoundError: FirebaseOptions$Builder
  • gps1.trace

    Wildcard does not works:

    adb pull /sdcard/gps*.trace .

    Related posts:

    Convert file: Uri to File in Android
    Menu items not shown in menu bar
    How to hide soft touch buttons on devices like Galaxy Nexus
    Android: sound API (deterministic, low latency)
    what is the use of SQLiteDatabase.CursorFactory in Android?
    View SQL generated by ORMLite on Android
  • Block the default animation for startActivity
  • Android Create Sip Account Programmatically
  • Where is the debug.keystore on Mac?
  • How to specify id when uses include in layout xml file
  • Adb android conflict with Genymotion
  • ClassCastException: ApiVersionImpl cannot be cast to java.lang.Integer
  • 9 Solutions collect form web for “adb pull multiple files”

    You can use xargs and the result of the adb shell ls command which accepts wildcards. This allows you to copy multiple files. Annoyingly the output of the adb shell ls command includes line-feed control characters that you can remove using tr -d '\r'.


    adb shell 'ls /sdcard/gps*.trace' | tr -d '\r' | xargs -n1 adb pull  

    adb pull can receive a directory name instead of at file and it will pull the directory with all files in it.

    Pull all your gps traces in /sdcard/gpsTraces

    adb pull /sdcard/gpsTraces/ . 

    Example of adb pull and adb push of recursive directories:

    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)

    ./adb pull /sdcard <– fails

    ./adb pull /sdcard/ <– works recursively – note the trailing slash

    Tested with Nexus 5 and adb downloaded March 2014.

    ADBFS a FUSE Filesystem for Android Debug Bridge if you are using linux or mac

    I have created this for Windows boxes, It is very useful to transfer files using wildcards without mounting the filesystem. You can include this script somewhere in your path env.


    @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!"

    adbpull /sdcard/DCIM/Camera/IMG_2016*

    Directory pull is available on new android tools.
    ( I don’t know from which version it was added, but its working on latest 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)

    Even though adb pull command started accepting folder name for the remote parameter, I still prefer to use tar command. It provides more flexibility – allows for file name patterns (both include and exclude), symlink control, preserves file permissions. Since Android 6.0 you can use a built-in. Before that you had to use 3rd-party tools like busybox:

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

    Make sure to omit the leading / in your path.

    building on David’s answer, I find this to be slightly better:

    adb shell ls /foo | tr -d '\r' | xargs -n1 adb pull

    In addition to it being one character less to type (big deal) it doesn’t convert the -r into a space. This is a significant difference, as if you try to do

    adb shell ls /foo/myFile* | tr '\r' ' ' | xargs -i -n1 adb pull {} someDir

    you’ll get error saying

    remote object '/foo/myFile1 ' does not exist

    Instead you can do this, which will work:

    adb shell ls /foo/myFile* | tr -d '\r' | xargs -i -n1 adb pull {} someDir 

    In Android, there are some folder with associated permissions! Some folder belong to root- or system user.

    You guys should change the permissions of those files, folders before doing “adb pull”.

    The following commands could help:

    adb shell
    chmod -R 777 target_folder
    adb pull /.../target_folder/ . (current local folder)
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.