2012-10-30 4 views
40

Ich denke, adb Push ist dateibasiert. Ich möchte ganze Ordner schieben können. Gibt es einen einfachen Weg ohne Scripting?android: Rekursive Kopie mit adb Push

Danke!

Bearbeiten: Ich muss mit Unterordnern arbeiten.

Edit: Scheint, dass adb ziehen rekursiv ist, aber Push ist nicht. Also habe ich den Titel und die Beschreibung entsprechend geändert.

Antwort

67

Versuchen Sie Folgendes (mit Unterordnern gearbeitet): adb push mySourceFolder/. myDestAndroidFolder UPD: leere Ordner nicht auf Android-Gerät kopieren.

+1

Ich habe Ihre Antwort als korrekt markiert, weil ich Ihre Probe am deutlichsten finde. Obwohl Demilano auch die Ausgabe lieferte, war das Push-Beispiel nicht so klar wie bei Ihnen. – kakyo

+0

Sie können Unterordner in einem Befehl erstellen, bevor Sie den Push ausführen, siehe meine Antwort unten. – autra

+0

Es erfordert einen Schrägstrich für mich: '' 'adb push mySourceFolder /. myDestAndroidFolder/'' ' –

21

adb ziehen, zieht alle Dateien im angegebenen Verzeichnis:

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

oder

$ 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

Was passiert, wenn ich in diesem Verzeichnis Unterverzeichnisse haben? – kakyo

+0

Sie können versuchen, einige Ordner zu erstellen und –

+0

Ich habe es bereits versucht. Es funktioniert nicht. Genau deshalb habe ich diese Frage gestellt. – kakyo

5

Ich weiß, diese Frage ist ein wenig alt und ich bin über Scripting zu erwähnen, wenn die Frage ausgeschlossen, aber ich werde das trotzdem beantworten. Vor allem, weil ich wünschte, ich hätte diese Antwort hier gefunden, bevor ich es selbst ausarbeiten musste.

adb Push rekursiv arbeiten, wenn alle Unterordner bereits vorhanden sind. Sie können leer sein, es scheint nur, dass adb push keine Ordner machen kann. Ich fand dies eine nützliche Unterscheidung sein, weil man eine Reihe von Befehlen wie folgt ausführen konnte:

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

Also, ja, könnte man ein kleines Wrapper-Skript machen dies automatisch zu tun. Ich denke jedoch, der wichtigere Punkt ist, dass es nur die Ordner benötigt, um dort zu sein. Was bedeutet, dass wenn Sie das sind, Sie mehrmals in demselben Ordner aktualisieren werden. Zum Beispiel würde das Hinzufügen von Bildern zu einer bestehenden Unterordnerstruktur mit dem einzelnen adb-Push-Befehl immer wieder gut funktionieren.

14

Ich werde diese noch graben eine vollständige Lösung dieses Problems (nur für Linux) zu geben, weil Google diese umleiten und ich hatte genau dieses gleiche Problem.

Mit einem einfachen adb push, ist das Problem, dass alle Unterverzeichnisse, bevor Sie die Push existieren müssen, die sehr schmerzhaft sein können, zu erreichen.

Beachten Sie, dass eine einfache Lösung ist es, den Ordner zu zip, drücken Sie die Zip entpacken dann auf dem Gerät. Aber nehmen wir an, Sie haben nicht auf Ihrem Gerät entpacken (sehr unwahrscheinlich, wirklich).

Sie wollen einen vollständigen Baum mit vielen Unterverzeichnissen auf Ihr Gerät in einem leeren Verzeichnis mydirectory schieben. Es gibt zwei Schritte:

Zuerst alle Unterverzeichnisse erstellen, in Ihrem Quellgerät:

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

Dieser Befehl alle Unterverzeichnisse von mydirectory finden (einschließlich, also wenn mydirectory bereits vorhanden ist, werden Sie einen Fehler haben. Nachricht, die Sie ignorieren können) und für jede von ihnen, erstellen Sie das passende Verzeichnis auf dem Gerät.

dann alles schieben

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

funktioniert das" adb push C:/Benutzer/Pss/Pictures/Android 4.4/hd /. mnt/sdcard "? – Gattsu

+0

Vergessen zu erwähnen, dass es nur unter Linux funktioniert :-) Ich bearbeite. – autra

+0

hilf mir für meine Android-Emulator :(Bitte überprüfen Sie diese https://www.dropbox.com/s/eop95ul0gxtnkd0/error.png – Gattsu

3

auf autra ‚s Genie beantworten ein wenig zu erweitern, habe ich eine schnelle Skript diese (für Linux/Mac nur) zu automatisieren.

Ich habe eine leere Datei in meinem Home-Verzeichnis adb-push genannt. Dann bearbeitet ich die Datei mit einem Texteditor (wie gedit, nano, vim, etc.) und stellen den folgenden Inhalt hinein:

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

Dann machte ich es ausführbar:

chmod +x ~/adb-push; 

Dies ist wie ich es laufen:

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

zum Beispiel, wenn ich "~/backups/DCIM" zu meinen Geräts sdcard Ordner senden möchten, würde ich dies tun:

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

(Aber denken Sie daran, dass die Lage des sdcard nicht für jedes Android-Gerät „/sdcard“ ist. Zum Beispiel könnte es "/mnt/sdcard" stattdessen sein.)

1

Es ist ein paar Jahre, die Probleme Mai oder Mai nicht geändert haben, aber es ist immer noch ein PITA. Was ist für mich unter Linux arbeitet, ist ein temporären Ordner zu erstellen, erstellen Sie einen symbolischen Link auf den Ordner (n) ich kopiert werden soll, und dann schiebt ich adb. Es ignoriert das Hauptverzeichnis, kopiert aber die Unterverzeichnisse. Derzeit bin ich keine subdirs erstellen benötigen, sie für mich erstellt und kopiert werden. Das könnte plattformspezifisch sein, da bin ich mir nicht sicher. Aber das Hauptverzeichnis, das ich kopiere, kopiert die Dateien darin anstelle des Verzeichnisses. Daher wird das temporäre Verzeichnis ignoriert und die symbolisch verknüpften Ordner werden kopiert.

Beispiel:

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

Und es wird Foo/file1 zu /sdcard/Foo/file1 schieben. Mit nur adb push Foo/. /sdcard/ dann beende ich mit /sdcard/file1 up was mich glücklich macht nicht.

0

Wie etwa: Archiv -> Push -> extrahieren

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

Ich hatte eingereicht ein Edit, das eine Änderung des 'adb push' zum Codeblock erforderte, war lesbar. Mutabilität sollte prüfen, ob es die gleiche Absicht hat. – hoss

2

in diese Ran auch und fanden diesen Artikel nützlich, kann aber eine umfassendere Lösung gefunden haben. Ausführen der folgenden Optionen aus dem Ordner schieben Sie die Dateien/Ordner, die Sie wollen enthalten:

adb push . /myDestinationFolder

Der Schlüssel ist das Präfix ‚/‘ vor dem Zielordner offenbar. Das funktioniert über meine Windows-Eingabeaufforderung, aber wenn ich es von git bash (unter Windows) aus starte, erhalte ich einige Fehler aufgrund der Bedeutung von '/' in einem Pfad innerhalb der Bash-Shell. So könnte dies nicht von Linux/bash arbeiten, aber es ist auf jeden Fall alle Unterordner für mich kopiert.