android: Recursive copy with adb push

2019-01-30 22:34发布

I think adb's push is file-based. I want to be able to push entire folders. Is there an easy way without scripting?

Thanks!

Edit: I need to work with sub-folders.

Edit: Seems that adb pull is recursive but push is not. So I changed the title and description accordingly.

标签: android adb
9条回答
迷人小祖宗
2楼-- · 2019-01-30 23:15

adb pull, pulls all the files in the specified directory:

$ adb pull /mnt/sdcard/
pull: building file list...
pull: /mnt/sdcard/t3.txt -> ./t3.txt
pull: /mnt/sdcard/t2.txt -> ./t2.txt
pull: /mnt/sdcard/t1.txt -> ./t1.txt
3 files pulled. 0 files skipped.

or

$ adb push . /mnt/sdcard/
push: ./t2.txt -> /mnt/sdcard/t2.txt
push: ./t3.txt -> /mnt/sdcard/t3.txt
push: ./t1.txt -> /mnt/sdcard/t1.txt
3 files pushed. 0 files skipped.
查看更多
对你真心纯属浪费
3楼-- · 2019-01-30 23:16

It has been a few years, the issues may or may not have changed, but it is still a PITA. What is working for me on linux is to create a temp folder, create a symlink to the folder(s) I want to copy, and then I adb push. It ignores the main dir, but copies the subdirs. Currently, I'm not needing to create any subdirs, they do get created and copied for me. That might be platform specific, I'm not sure. But the main dir I'm copying, it copies the files in it instead of the dir. So the temp dir gets ignored, and the symlinked folders then get copied. Example: mkdir tmp cd tmp ln -s ../Foo . ln -s ../Bar . cd .. adb push tmp /sdcard/ And it will push Foo/file1 to /sdcard/Foo/file1 With just adb push Foo/. /sdcard/ then I end up with /sdcard/file1 which doesn't make me happy.

查看更多
Anthone
4楼-- · 2019-01-30 23:22

How about: archive -> push -> extract

查看更多
做个烂人
5楼-- · 2019-01-30 23:24

Ran into this as well and found this article useful, but may have found a more complete solution. Running the following from the folder containing the files/folders you want to push:

adb push . /myDestinationFolder

The key is the prefix '/' before the destination folder apparently. This works from my windows command prompt, but when I run it from git bash (on Windows) I get some errors due to the meaning of the '/' in a path within the bash shell. So this might not work from linux/bash, however it definitely copied all subfolders for me.

查看更多
看我几分像从前
6楼-- · 2019-01-30 23:27
export FOLDER="Books"
TMPIFS="$IFS"
IFS=$'\n'
for i in `find "$FOLDER"/ -type d | sed 's,//\+,/,g'`; do
  adb shell mkdir -p /mnt/sdcard/"$i"
done && \
adb push "$FOLDER"/ /mnt/sdcard/"$FOLDER"
unset FOLDER
IFS="$TMPIFS"
查看更多
Juvenile、少年°
7楼-- · 2019-01-30 23:29

To expand on autra's genius answer a bit, I made a quick script to automate this (for Linux/Mac only).

I created an empty file in my home directory called adb-push. Then I edited the file with a text editor (like gedit, nano, vim, etc.) and put the following contents into it:

#!/bin/bash

# Usage:
# adb-push <directory-on-computer-to-send> <directory-on-device-to-receive-it>
# Example:
# adb-push ~/backups/DCIM /sdcard

src="${1}";
trgt="$(basename ${1})";
dst="$(echo "${2}" | grep '/$')";
# If ${dst} ends with '/', remove the trailing '/'.
if [ -n "${dst}" ]; then
    dst="${dst%/*}";
fi;

# If ${src} is a directory, make directories on device before pushing them.
if [ -d "${src}" ]; then
    cd "${src}";
    cd ..;
    trgt="${trgt}/";
    find "${trgt}" -type d -exec adb shell mkdir "${dst}/{}" \;
fi;

adb push "${src}" "${dst}/${trgt}";

Then I made it executable:

chmod +x ~/adb-push;

This is how I run it:

~/adb-push <directory-on-computer-to-send> <directory-on-device-to-receive-it>

For example, if I want to send "~/backups/DCIM" to my device's sdcard folder, I would do this:

~/adb-push ~/backups/DCIM /sdcard

(But keep in mind that the location of the sdcard is not "/sdcard" for every Android device. For instance, it might be "/mnt/sdcard" instead.)

查看更多
登录 后发表回答