android:adb push的递归副本

时间:2012-10-30 18:57:47

标签: android adb

我认为adb的推动是基于文件的。 我希望能够推送整个文件夹。 没有脚本有没有简单的方法?

谢谢!

编辑: 我需要使用子文件夹。

编辑: 似乎adb pull是递归的,但push不是。 所以我相应地改变了标题和描述。

10 个答案:

答案 0 :(得分:80)

尝试此操作(使用子文件夹):adb push mySourceFolder/. myDestAndroidFolder

空文件夹不会复制到Android设备。

答案 1 :(得分:22)

adb pull,拉取指定目录中的所有文件:

$ 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.

$ 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.

答案 2 :(得分:19)

我会更深入地研究这个问题(仅适用于Linux),因为谷歌重定向到这个问题,我有同样的问题。

使用简单的adb推送,问题是所有子目录必须在执行推送之前存在,这可能非常痛苦。

请注意,一个简单的解决方案是压缩文件夹,推拉链接然后在设备上解压缩。但是,假设您没有在设备上解压缩(实际上非​​常不可能)。

您希望将包含许多子目录的完整树推送到空目录myDirectory中的设备。有两个步骤:

首先在源设备中创建所有子目录:

cd <folder-containing-myDirectory>
find myDirectory/ -type d -exec adb shell mkdir <path-to-folder-containing-myDirectory-in-device>/{} \;

此命令查找myDirectory的所有子目录(包括。,因此,如果myDirectory已经存在,您将有一条可以安全忽略的错误消息),并为每个子目录创建设备上的匹配目录。

然后推送一切

adb push myDirectory/. <path-to-folder>/myDirectory

答案 3 :(得分:4)

我意识到这个问题有点老了,当问题排除在外时我会提到脚本,但我还是要回答这个问题。大多数情况下,因为我希望我在这里找到这个答案,然后才能自己解决。

如果所有子文件夹都已存在,则

adb push将递归工作。它们可以是空的,它似乎只是adb push无法制作文件夹。我发现这是一个有用的区别,因为可以运行一系列这样的命令:

$ adb shell mkdir /folder
$ adb shell mkdir /folder/sub1
$ adb shell mkdir /folder/sub2
$ adb push folder

所以,是的,可以制作一个小的包装器脚本来自动执行此操作。但是,我认为更重要的一点是它只需要文件夹就在那里。这意味着如果这是您要在同一文件夹中多次更新的内容。例如,使用单个adb push命令将图片添加到现有的子文件夹结构将会一次又一次地工作。

答案 4 :(得分:3)

为了扩展autra的天才回答,我制作了一个快速脚本来自动执行此操作(仅适用于Linux / Mac)。

我在我的主目录中创建了一个名为adb-push的空文件。然后我用文本编辑器(如gedit,nano,vim等)编辑了文件,并将以下内容放入其中:

#!/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}";

然后我把它变为可执行文件:

chmod +x ~/adb-push;

这是我运行它的方式:

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

例如,如果我想发送&#34; 〜/ backups / DCIM &#34;到我的设备的SD卡文件夹,我会这样做:

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

(但请记住,对于每个Android设备,SD卡的位置都不是&#34; / sdcard &#34;例如,它可能是&#34; / mnt / sdcard &#34;而不是。)

答案 5 :(得分:2)

也进入这个并发现这篇文章有用,但可能已经找到了更完整的解决方案。从包含要推送的文件/文件夹的文件夹中运行以下命令:

adb push . /myDestinationFolder

键显然是目标文件夹前的前缀'/'。这可以从我的Windows命令提示符开始,但是当我从git bash(在Windows上)运行它时,由于bash shell中路径中'/'的含义,我得到一些错误。所以这可能不适用于linux / bash,但它确实为我复制了所有子文件夹。

答案 6 :(得分:1)

已经有几年了,问题可能会或可能不会改变,但它仍然是PITA。在linux上为我工作的是创建一个临时文件夹,为我要复制的文件夹创建一个符号链接,然后我adb push。它忽略主目录,但复制子目录。目前,我不需要创建任何子目录,它们会为我创建和复制。这可能是特定于平台的,我不确定。但主要的目录是我复制,它复制文件而不是目录。因此,临时目录被忽略,然后复制符号链接的文件夹。例: mkdir tmp cd tmp ln -s ../Foo . ln -s ../Bar . cd .. adb push tmp /sdcard/ 它会将Foo / file1推送到/ sdcard / Foo / file1 只需adb push Foo /。 / sdcard /然后我最终得到/ sdcard / file1,这并不能让我开心。

答案 7 :(得分:1)

如何:存档 - &gt;推 - &gt;提取

答案 8 :(得分:0)

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"

答案 9 :(得分:0)

我找不到解决方案,所以我做了一个:

from ppadb.client import Client as AdbClient
adb = AdbClient(host='127.0.0.1', port=5037)
devices = adb.devices()    #List of all connected devices
import os
import glob

def send_over_adb(device,hostpath,devpath="/storage/emulated/0/"):      # Recursively send folder and files over adb
    if os.path.isfile(hostpath):
        devpath = os.path.join(devpath,hostpath).replace('\\','/') # optimization for windows
        device.push(hostpath, devpath)
    elif os.path.isdir(hostpath):
        for i in glob.glob(hostpath+'\*'):
            print(i)
            send_over_adb(device,i,devpath)
    device.shell('am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///mnt/sdcard')
    device.shell('am force-stop com.android.gallery3d') #force create thumbnails

该函数递归发送文件夹和文件,同时保持文件夹结构并忽略空目录。

限制:文件名不应包含正斜杠或反斜杠(idk,如果任何操作系统允许)