我認爲adb的推送是基於文件的。 我希望能夠推送整個文件夾。 沒有腳本是否有簡單的方法?android:用adb遞推複製
謝謝!
編輯: 我需要使用子文件夾。
編輯: 似乎adb拉是遞歸的,但推不是。 所以我相應地改變了標題和描述。
我認爲adb的推送是基於文件的。 我希望能夠推送整個文件夾。 沒有腳本是否有簡單的方法?android:用adb遞推複製
謝謝!
編輯: 我需要使用子文件夾。
編輯: 似乎adb拉是遞歸的,但推不是。 所以我相應地改變了標題和描述。
試試這個(使用子文件夾):adb push mySourceFolder/. myDestAndroidFolder
UPD:空文件夾不會複製到Android設備。
亞行拉,拉在指定目錄中的所有文件:
$ 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將遞歸地工作,如果所有的子文件夾已經存在。它們可以是空的,似乎adb push不能製作文件夾。我發現這是一個有用的區別,因爲人們可以像這樣運行一系列命令:
$ adb shell mkdir /folder
$ adb shell mkdir /folder/sub1
$ adb shell mkdir /folder/sub2
$ adb push folder
所以,是的,我們可以做一個小包裝腳本來自動執行此操作。不過,我認爲更重要的一點是,它只需要文件夾在那裏。這意味着如果這是你要在同一個文件夾中多次更新的東西。例如,將圖片添加到現有的子文件夾結構中可以使用單個adb push命令反覆使用。
我要去挖掘這個更完整的解決方案(僅適用於linux),因爲谷歌重定向到這一點,我有這個完全相同的問題。
通過簡單的adb push,問題是所有子目錄必須在執行推送之前存在,這可能非常痛苦。
請注意,一個簡單的解決方案是壓縮文件夾,然後按壓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
要擴大autra
的天才回答了一下,我做了一個快速腳本來自動完成這個(對於Linux /僅限Mac)。
我在我的主目錄中創建了一個空文件,名爲adb-push
。然後我編輯使用文本編輯器(如gedit中,納米,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>
例如,如果我要發「〜/備份/ DCIM」我的設備的SD卡的文件夾,我這樣做:
~/adb-push ~/backups/DCIM /sdcard
(但要記住的是,SD卡的位置不是「/SD卡」爲每一個Android設備。例如,它可能是「/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"
我已經提交需要修改'adb push'到代碼塊的編輯是可讀的。可變性應該檢查它是否具有相同的意圖。 – hoss
跑進這個問題,以及發現這篇文章有用,但可能已經找到了更完整的解決方案。從運行包含要推的文件/文件夾的文件夾下面的:
adb push . /myDestinationFolder
的關鍵顯然是目標文件夾前的前綴「/」。這從我的Windows命令提示符工作,但是當我從git bash(在Windows上)運行它時,由於bash shell中的路徑中'/'的含義,我得到一些錯誤。所以這可能不適用於Linux/bash,但它確實複製了所有子文件夾。
我標記你的答案是正確的,因爲我發現你的樣本是最清晰的。儘管demilano也給出了輸出結果,但推舉的例子並不像你的那麼清楚。 – kakyo
在執行推送之前,您可以在一個命令中創建子文件夾,請參閱下面的答案。 – autra
它需要一個斜槓:'''adb push mySourceFolder /。 myDestAndroidFolder /''' –