簡體   English   中英

android:使用 adb push 遞歸復制

[英]android: Recursive copy with adb push

我認為 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/ mkdir tmp cd tmp ln -s ../Foo . ln -s ../Bar . cd .. adb push tmp /sdcard/ 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM