65

adb のプッシュはファイルベースだと思います。フォルダ全体をプッシュできるようにしたい。スクリプトなしで簡単な方法はありますか?

ありがとう!

編集:サブフォルダーを操作する必要があります。

編集: adb pull は再帰的ですが、push はそうではないようです。というわけで、タイトルと説明を適宜変更しました。

4

10 に答える 10

113

これを試してください(サブフォルダーで動作しました)adb push mySourceFolder/. myDestAndroidFolder:.

空のフォルダは Android デバイスにコピーされません。

于 2013-05-02T10:59:49.933 に答える
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 に答える
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

(ただし、sdcard の場所は、すべての Android デバイスで " /sdcard " ではないことに注意してください。たとえば、代わりに " /mnt/sdcard " である可能性があります。)

于 2015-03-10T20:46:54.490 に答える
4

この質問は少し古いことに気づきました。質問でスクリプトが除外されたときにスクリプトについて言及しようとしていますが、とにかくこれに答えます。ほとんどの場合、自分で解決する前に、ここでこの答えを見つけたかったからです。

すべてのサブフォルダーが既に存在する場合、adb push は再帰的に機能します。それらは空である可能性があります.adb pushはフォルダを作成できないようです. 次のような一連のコマンドを実行できるため、これは便利な区別であることがわかりました。

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

したがって、はい、これを自動的に行う小さなラッパー スクリプトを作成できます。ただし、より重要な点は、フォルダーがそこにあることだけが必要であるということだと思います。これは、これが同じフォルダーで複数回更新するものである場合を意味します。たとえば、既存のサブフォルダー構造に写真を追加すると、1 つの adb push コマンドで何度でもうまく機能します。

于 2013-03-17T06:18:54.450 に答える
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

この関数は、フォルダー構造を維持しながらフォルダーとファイルを再帰的に送信し、空のディレクトリを無視します。

制限: ファイル名にスラッシュまたはバック スラッシュを含めないでください (OS で許可されている場合は idk)。

于 2021-01-17T16:27:18.857 に答える