Reputation: 152206
What is the best way to pull multiple files using
adb pull
I have on my /sdcard/
25 files with following name:
gps1.trace
gps2.trace
...
gps25.trace
Wildcard does not work:
adb pull /sdcard/gps*.trace .
Upvotes: 113
Views: 118855
Reputation: 231
With a linux host, and the understanding that the pathological examples mentioned above about not parsing the output of ls are, uh, pathological.... In real life I've always been able to just turn globbing with ls into globbing for adb pull by using dumbshit back quotes:
adb pull `adb shell ls /sdcard/Download/*.txt` .
pulls *.txt in /sdcard/Download from the phone into the current directory (for example). Srinivasu u's, for example, can be accomplished with:
adb pull `adb shell ls /data/media/0/WhatsApp/Media/WhatsApp\ Profile\ Photos/*` .
I find this as close as I can get to what we all really want to type. It doesn't depend on any feature or syntax that depends on any particular shell. (I don't know if Windows supports back-quotes. [Takes out onion...]). It also has the advantage that I can actually remember it....
Upvotes: 0
Reputation: 2092
I wanted to expand on David Momenso's answer and address the specific part of the question about wildcards. I turned his suggestion into a bash function that will allow for passing in a parameter that will append to the wildcard.
This a bash function that will allow for pulling all videos based on the date, utilizing the passed in parameter and wildcard.
function vids () { adb shell 'ls /sdcard/DCIM/Camera/VID_2022'"$1"'*.mp4' | tr -d '\r' | sed -e 's/^\///' | xargs -n1 adb pull }
/sdcard/DCIM/Camera/VID_2022
is pointing to the Camera folder and has the file prefix that accounts for the current year"$1"
is take the first parameter that comes after the function call
1027
in the example usage vids 1027
Upvotes: 0
Reputation: 84
This is possible using adb exec-out
. For example to get all of today's screenshots you can do:
adb exec-out "cd /sdcard/Pictures/Screenshots; tar c Screenshot_20210907*" | tar x
This will transfer all of the files inside a temporary tar archive and extract it to your current working directory. Credit is due to https://stackoverflow.com/a/39429196/3347392.
Upvotes: 1
Reputation: 61
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.
Upvotes: 6
Reputation: 331
I used this:
adb pull $(adb shell ls /storage/9016-4EF8/DCIM/Camera/wildcard*) ./
Upvotes: 0
Reputation: 12728
I am using Windows adb.exe
and gitbash
, even syntax is right, adb.exe
says it cannot find files if used in xargs
.
You have to use cmd for
loop:
for /f "delims=" %G in ('adb shell find sdcard/DCIM/Camera/20221111*') do adb pull -a "%G"
This will download all photos and videos matching the criteria(in my case, taken on the day 2022 Nov 11st).
Find more info googling for /f
and linux find
.
If you don't have find
available(Gitbash not installed), a workaround is to move all files you want on phone to another new album and adb pull
from there. Not a solution but a workaround.
adb pull -a sdcard/DCIM/new-album . # will pull all photos to a folder called "new-album"
Upvotes: 1
Reputation: 2001
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'
.
Examples:
# 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
Upvotes: 161
Reputation: 1896
Parsing the output from 'ls' is generally a bad idea. Instead, use 'find'.
adb shell 'find /sdcard/ -name "gps*.trace" -print0' | xargs -0 -n 1 adb pull
Why you shouldn't parse the output of ls
Upvotes: 20
Reputation: 1463
Wild cards work in my case, I have been using following simple script to import Whatsapp Images of my virtual device in to my desktop
#! /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
Upvotes: 0
Reputation: 351
./adb pull /sdcard
<-- fails
./adb pull /sdcard/
<-- works recursively - note the trailing slash
Tested with Nexus 5 and adb downloaded March 2014.
Upvotes: 29
Reputation: 2238
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.
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
Example:
adbpull /sdcard/DCIM/Camera/IMG_2016*
Upvotes: 7
Reputation: 4681
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
Upvotes: 2
Reputation: 2149
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
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Upvotes: -3
Reputation: 9032
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)
Upvotes: 4
Reputation: 10908
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)
Upvotes: 112
Reputation: 411
ADBFS a FUSE Filesystem for Android Debug Bridge if you are using linux or mac
Upvotes: 5