我认为adb的推动是基于文件的。 我希望能够推送整个文件夹。 没有脚本有没有简单的方法?
谢谢!
编辑: 我需要使用子文件夹。
编辑: 似乎adb pull是递归的,但push不是。 所以我相应地改变了标题和描述。
答案 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,如果任何操作系统允许)