2012-10-30 14 views
40

Myślę, że push adb jest oparty na plikach. Chcę móc przesyłać całe foldery. Czy istnieje prosta droga bez skryptów?android: kopia rekurencyjna z adb push

Dzięki!

Edytuj: Potrzebuję pracować z podfolderami.

Edycja: Wygląda na to, że adb pull jest rekursywny, ale push nie jest. Zmieniłem odpowiednio tytuł i opis.

Odpowiedz

67

Spróbuj tego (działa z podfolderami): adb push mySourceFolder/. myDestAndroidFolder UPD: puste foldery nie kopiują do urządzenia z systemem Android.

+1

Oznaczyłem twoją odpowiedź jako poprawną, ponieważ uważam twoją próbkę za najczystszą. Chociaż demilano również dało wyniki, przykład pushu nie był tak wyraźny jak twój. – kakyo

+0

Możesz utworzyć podfoldery w jednym poleceniu przed wykonaniem polecenia push, zobacz moją odpowiedź poniżej. – autra

+0

Wymaga to ukośnego ukośnika: '' 'adb push mySourceFolder /. myDestAndroidFolder/'' ' –

21

adb pull, ściąga wszystkie pliki w podanym katalogu:

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

lub

$ 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

Co jeśli mam podfoldery w tym katalogu? – kakyo

+0

Możesz spróbować tworzyć foldery i uruchamiać je. –

+0

Próbowałem już. To nie działa. Właśnie dlatego zadałem to pytanie. – kakyo

5

uświadamiam sobie to pytanie jest trochę stary i mam zamiar wspomnieć włączony, gdy pytanie wykluczyłem to, ale i tak mam zamiar odpowiedzieć na to pytanie. Głównie dlatego, że żałuję, że nie znalazłem tutaj odpowiedzi, zanim sam będę musiał ją rozwiązać.

adb push WILL działa rekurencyjnie, jeśli wszystkie podfoldery już istnieją. Mogą być puste, po prostu wydaje się, że adb push nie może tworzyć folderów. Uważam, że jest to przydatne rozróżnienie, ponieważ można uruchomić serię poleceń tak:

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

Tak, tak, można by zrobić mały skrypt otoki to zrobić automatycznie. Jednak myślę, że ważniejsze jest to, że wymaga tylko folderów. Oznacza to, że jeśli jest to coś, co zamierzasz aktualizować wiele razy w tym samym folderze. Na przykład dodanie obrazków do istniejącej struktury podfolderu będzie działać w kółko za pomocą pojedynczego polecenia adb push.

14

Mam zamiar wykopać to jeszcze bardziej, aby dać pełne rozwiązanie tego (tylko dla Linuksa), ponieważ google przekierować do tego i miałem ten sam ten sam problem.

Z prostym naciśnięciem adb, problem polega na tym, że wszystkie podkatalogi muszą istnieć PRZED naciśnięciem przycisku, co może być bardzo bolesne w osiągnięciu.

Należy pamiętać, że łatwym rozwiązaniem jest zip folder, wciśnij zamek, a następnie rozpakuj urządzenie. Ale załóżmy, że nie masz rozpakowanego urządzenia (bardzo nieprawdopodobne, naprawdę).

Chcesz wypchnąć pełne drzewo z wieloma podkatalogami do swojego urządzenia w pustym katalogu myDirectory. w urządzeniu źródłowym

Najpierw utwórz wszystkie podkatalogi,:: Istnieją dwa kroki

cd <folder-containing-myDirectory> 
find myDirectory/ -type d -exec adb shell mkdir <path-to-folder-containing-myDirectory-in-device>/{} \; 

Polecenie znaleźć wszystkie podkatalogi myDirectory (w tym, więc jeśli myDirectory już istnieje, trzeba będzie jeden błąd. wiadomość, którą możesz bezpiecznie zignorować) i dla każdego z nich utwórz odpowiedni katalog na urządzeniu.

następnie wcisnąć wszystko

adb push myDirectory/. <path-to-folder>/myDirectory 
+0

to działa" adb push C:/Users/Pss/Pictures/Android 4.4/hd/.mnt/sdcard "? – Gattsu

+0

Zapomniałem wspomnieć, że będzie działać tylko na Linuksie :-) Edytuję. – autra

+0

Pomóżcie mi w emulatorze androidowym :(sprawdź to https://www.dropbox.com/s/eop95ul0gxtnkd0/error.png – Gattsu

3

rozszerzyć na geniuszu autra „s odpowiedzieć trochę, zrobiłem krótki skrypt, aby zautomatyzować ten (dla Linux/Mac tylko).

Utworzono pusty plik w moim katalogu domowym o nazwie adb-push. Potem edytowany plik za pomocą dowolnego edytora tekstu (jak gedit, nano, vim, etc.) i umieścić następującą zawartość w nim:

#!/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}"; 

Potem zrobiłem to wykonywalny:

chmod +x ~/adb-push; 

Jest jak go uruchomić:

~/adb-push <directory-on-computer-to-send> <directory-on-device-to-receive-it> 

na przykład, jeśli chcę wysłać "~/backups/DCIM" do folderu sdcard mojego urządzenia, chciałbym to zrobić:

~/adb-push ~/backups/DCIM /sdcard 

(Należy jednak pamiętać, że lokalizacja nie jest sdcard „/sdcard” dla każdego urządzenia z systemem Android. Na przykład może to być "/mnt/sdcard" zamiast tego).

1

Minęło kilka lat, problemy mogły, ale nie musiały ulec zmianie, ale wciąż jest to PITA. To, co działa dla mnie na Linuksie, to utworzenie folderu tymczasowego, utworzenie dowiązania symbolicznego do folderów, które chcę skopiować, a następnie adb push. Ignoruje główny katalog, ale kopiuje podkatalogi. Obecnie nie potrzebuję tworzyć żadnych podkatalogów, są one tworzone i kopiowane dla mnie. To może być specyficzna dla platformy, nie jestem pewien. Ale główny katalog, który kopiuję, kopiuje pliki w nim zamiast katalogu. W ten sposób katalog tymczasowy zostanie zignorowany, a foldery z symbolami połączonymi z nim zostaną skopiowane.

Przykład:

mkdir tmp 
cd tmp 
ln -s ../Foo . 
ln -s ../Bar . 
cd .. 
adb push tmp /sdcard/ 

I będzie naciskać Foo/file1 do /sdcard/Foo/file1. Po prostu adb push Foo/. /sdcard/, a następnie kończę z /sdcard/file1, który nie czyni mnie szczęśliwym.

0

Jak o: Archiwum -> Naciśnij -> wyodrębnić

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

Złożyłem modyfikacja, która wymagała zmiany w 'adb push' na blok kodu była czytelna. zmienność powinna sprawdzać, czy ma on tę samą intencję. – hoss

2

Ran do tego jak dobrze i znalazłem ten artykuł przydatny, ale może znaleźć bardziej kompletne rozwiązanie. Uruchamiając następujące z folderu zawierającego pliki/foldery do pchania:

adb push . /myDestinationFolder

Kluczem jest przedrostek „/” przed folderze docelowym widocznie. Działa to z wiersza poleceń systemu Windows, ale po uruchomieniu go z git bash (w systemie Windows) otrzymuję błędy ze względu na znaczenie "/" w ścieżce w powłoce bash. To może nie działać z linux/bash, ale zdecydowanie skopiowało dla mnie wszystkie podfoldery.