adb のプッシュはファイルベースだと思います。フォルダ全体をプッシュできるようにしたい。スクリプトなしで簡単な方法はありますか?
ありがとう!
編集:サブフォルダーを操作する必要があります。
編集: adb pull は再帰的ですが、push はそうではないようです。というわけで、タイトルと説明を適宜変更しました。
これを試してください(サブフォルダーで動作しました)adb push mySourceFolder/. myDestAndroidFolder
:.
空のフォルダは Android デバイスにコピーされません。
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.
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
(ただし、sdcard の場所は、すべての Android デバイスで " /sdcard " ではないことに注意してください。たとえば、代わりに " /mnt/sdcard " である可能性があります。)
この質問は少し古いことに気づきました。質問でスクリプトが除外されたときにスクリプトについて言及しようとしていますが、とにかくこれに答えます。ほとんどの場合、自分で解決する前に、ここでこの答えを見つけたかったからです。
すべてのサブフォルダーが既に存在する場合、adb push は再帰的に機能します。それらは空である可能性があります.adb pushはフォルダを作成できないようです. 次のような一連のコマンドを実行できるため、これは便利な区別であることがわかりました。
$ adb shell mkdir /folder
$ adb shell mkdir /folder/sub1
$ adb shell mkdir /folder/sub2
$ adb push folder
したがって、はい、これを自動的に行う小さなラッパー スクリプトを作成できます。ただし、より重要な点は、フォルダーがそこにあることだけが必要であるということだと思います。これは、これが同じフォルダーで複数回更新するものである場合を意味します。たとえば、既存のサブフォルダー構造に写真を追加すると、1 つの adb push コマンドで何度でもうまく機能します。
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
この関数は、フォルダー構造を維持しながらフォルダーとファイルを再帰的に送信し、空のディレクトリを無視します。
制限: ファイル名にスラッシュまたはバック スラッシュを含めないでください (OS で許可されている場合は idk)。