65

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

谢谢!

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

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

4

10 回答 10

113

adb push mySourceFolder/. myDestAndroidFolder试试这个(使用子文件夹):.

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

于 2013-05-02T10:59:49.933 回答
22

我将进一步挖掘这个以给出一个完整的解决方案(仅适用于 linux),因为谷歌重定向到这个,我有这个完全相同的问题。

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

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

您想将包含大量子目录的完整树推送到设备的空目录 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
于 2014-01-13T18:21:53.327 回答
21

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.
于 2012-10-30T19:05:42.467 回答
5

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

adb push . /myDestinationFolder

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

于 2015-08-05T21:59:55.880 回答
4

我意识到这个问题有点老了,当问题排除它时,我将提到脚本,但无论如何我都会回答这个问题。主要是因为我希望我能在这里找到这个答案,然后再自己解决。

如果所有子文件夹都已经存在, adb push 将递归工作。它们可以是空的,似乎 adb push 不能创建文件夹。我发现这是一个有用的区别,因为可以运行如下一系列命令:

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

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

于 2013-03-17T06:18:54.450 回答
4

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>

例如,如果我想将“ ~/backups/DCIM ”发送到我设备的 sdcard 文件夹,我会这样做:

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

(但请记住,对于每个 Android 设备,sdcard 的位置并不是“ /sdcard ”。例如,它可能是“ /mnt/sdcard ”。)

于 2015-03-10T20:46:54.490 回答
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 这并不让我高兴。

于 2015-04-08T19:52:16.473 回答
1

怎么样:存档->推送->提取

于 2015-06-24T20:14:59.130 回答
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"
于 2015-07-14T02:08:13.550 回答
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)

于 2021-01-17T16:27:18.857 回答