2012-10-30 26 views
40

我認爲adb的推送是基於文件的。 我希望能夠推送整個文件夾。 沒有腳本是否有簡單的方法?android:用adb遞推複製

謝謝!

編輯: 我需要使用子文件夾。

編輯: 似乎adb拉是遞歸的,但推不是。 所以我相應地改變了標題和描述。

回答

67

試試這個(使用子文件夾):adb push mySourceFolder/. myDestAndroidFolder UPD:空文件夾不會複製到Android設備。

+1

我標記你的答案是正確的,因爲我發現你的樣本是最清晰的。儘管demilano也給出了輸出結果,但推舉的例子並不像你的那麼清楚。 – kakyo

+0

在執行推送之前,您可以在一個命令中創建子文件夾,請參閱下面的答案。 – autra

+0

它需要一個斜槓:'''adb push mySourceFolder /。 myDestAndroidFolder /''' –

21

亞行拉,拉在指定目錄中的所有文件:

$ 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. 
+3

如果我在該目錄中有子文件夾會怎麼樣? – kakyo

+0

你可以嘗試創建一些文件夾並運行它 –

+0

我已經試過了。它不起作用。這正是我問這個問題的原因。 – kakyo

5

我意識到這個問題是有點老了,我什麼時候這個問題提的腳本排除它,但我要回答這個問題。大多數情況下,因爲我希望我在這裏找到了這個答案,然後我必須自己解決。

adb push將遞歸地工作,如果所有的子文件夾已經存在。它們可以是空的,似乎adb push不能製作文件夾。我發現這是一個有用的區別,因爲人們可以像這樣運行一系列命令:

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

所以,是的,我們可以做一個小包裝腳本來自動執行此操作。不過,我認爲更重要的一點是,它只需要文件夾在那裏。這意味着如果這是你要在同一個文件夾中多次更新的東西。例如,將圖片添加到現有的子文件夾結構中可以使用單個adb push命令反覆使用。

14

我要去挖掘這個更完整的解決方案(僅適用於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 
+0

將這個工作「adb push C:/ Users/Pss/Pictures/Android 4.4/hd/.mnt/sdcard」? – Gattsu

+0

忘了提及它只能在linux上工作:-)我正在編輯。 – autra

+0

幫助我爲我的android emmulator :(請看看這個https://www.dropbox.com/s/eop95ul0gxtnkd0/error.png – Gattsu

3

要擴大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」。)

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這不會讓我開心。

0

如何:檔案 - >推 - >提取

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" 
+0

我已經提交需要修改'adb push'到代碼塊的編輯是可讀的。可變性應該檢查它是否具有相同的意圖。 – hoss

2

跑進這個問題,以及發現這篇文章有用,但可能已經找到了更完整的解決方案。從運行包含要推的文件/文件夾的文件夾下面的:

adb push . /myDestinationFolder

的關鍵顯然是目標文件夾前的前綴「/」。這從我的Windows命令提示符工作,但是當我從git bash(在Windows上)運行它時,由於bash shell中的路徑中'/'的含義,我得到一些錯誤。所以這可能不適用於Linux/bash,但它確實複製了所有子文件夾。