我认为 adb 的推送是基于文件的。我希望能够推送整个文件夹。没有脚本有没有简单的方法?
谢谢!
编辑:我需要使用子文件夹。
编辑:似乎 adb pull 是递归的,但 push 不是。所以我相应地更改了标题和描述。
adb push mySourceFolder/. myDestAndroidFolder
试试这个(使用子文件夹):.
空文件夹不会复制到 android 设备。
我将进一步挖掘这个以给出一个完整的解决方案(仅适用于 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
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.
也遇到了这个问题,发现这篇文章很有用,但可能找到了更完整的解决方案。从包含您要推送的文件/文件夹的文件夹中运行以下命令:
adb push . /myDestinationFolder
显然,关键是目标文件夹之前的前缀“/”。这适用于我的 Windows 命令提示符,但是当我从 git bash(在 Windows 上)运行它时,由于 bash shell 中路径中“/”的含义,我会遇到一些错误。所以这可能不适用于 linux/bash,但它肯定为我复制了所有子文件夹。
我意识到这个问题有点老了,当问题排除它时,我将提到脚本,但无论如何我都会回答这个问题。主要是因为我希望我能在这里找到这个答案,然后再自己解决。
如果所有子文件夹都已经存在, adb push 将递归工作。它们可以是空的,似乎 adb push 不能创建文件夹。我发现这是一个有用的区别,因为可以运行如下一系列命令:
$ adb shell mkdir /folder
$ adb shell mkdir /folder/sub1
$ adb shell mkdir /folder/sub2
$ adb push folder
所以,是的,可以制作一个小包装脚本来自动执行此操作。但是,我认为更重要的一点是它只需要文件夹在那里。这意味着如果这是您要在同一个文件夹中多次更新的内容。例如,将图片添加到现有的子文件夹结构将使用单个 adb push 命令一遍又一遍地工作。
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 ”。)
几年过去了,问题可能会或可能不会改变,但它仍然是 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 这并不让我高兴。
怎么样:存档->推送->提取
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"
我找不到解决方案,所以我做了一个:
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)