ADB ziehen mehrere Dateien

85

Was ist der beste Weg, um mehrere Dateien mit zu ziehen

adb pull

Ich habe auf meinen /sdcard/25 Dateien folgenden Namen:

gps1.trace
gps2.trace
...
gps25.trace

Platzhalter funktioniert nicht:

adb pull /sdcard/gps*.trace .
hsz
quelle
4
Ich benutze nicht, adbaber aus den Dokumenten pullkann ein ganzes Verzeichnis gezogen werden ??? Wenn dies der Fall ist und dies Dateien sind, die von Ihrer eigenen App generiert wurden, schreiben Sie sie in ein Unterverzeichnis wie /sdcard/mygpsfilesund verwenden Sie sie dann adb pull /sdcard/mygpsfiles. Funktioniert das?
Squonk
2
Alternativ habe ich gerade den Datei-Explorer aus der DDMSPerspektive von Eclipse ausprobiert und konnte Dateien von meiner SD-Karte mehrfach auswählen und pullauf ihnen ausführen . Wenn Sie Eclipse nicht verwenden, ist DDMS als separates SDK-Tool verfügbar.
Squonk
monitorBefehl funktioniert super, sollte drin sein <sdkdir>/tools!
Santosh Kumar

Antworten:

137

Sie können xargsund das Ergebnis des adb shell lsBefehls verwenden, der Platzhalter akzeptiert. Auf diese Weise können Sie mehrere Dateien kopieren. Ärgerlicherweise enthält die Ausgabe des adb shell lsBefehls Zeilenvorschub-Steuerzeichen, die Sie mit entfernen könnentr -d '\r' .

Beispiele:

adb shell 'ls sdcard/gps*.trace' | tr -d '\r' | xargs -n1 adb pull
adb shell 'ls /sdcard/*.txt' | tr -d '\r' | sed -e 's/^\///' | xargs -n1 adb pull
David Momenso
quelle
Eigentlich sind das Wagenrückläufe, die gefiltert werden müssen, aber die richtige Idee zu einem obskuren Thema
Chris Stratton
4
Hier ist eine leicht verbesserte Version, die Leerzeichen in Dateinamen verarbeiten kann: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth
Zu Ihrer Information: Windows und DOS verwenden "\ r \ n" für Wagenrücklauf- / Zeilenvorschubpaare (dh nicht "\ n \ r").
BrainSlugs83
3
in meinem Fall schlug es fehl, die (korrekt erhaltenen) Dateinamen aus dem Stammverzeichnis des Android zu ziehen, um es zu lösen, ich benutzte:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
Es funktioniert nicht zu sagen, dass tr nicht als interner oder externer Befehl
erkannt wird
99

adb pull kann einen Verzeichnisnamen anstelle von at file erhalten und das Verzeichnis mit allen darin enthaltenen Dateien wird abgerufen.

Ziehen Sie alle Ihre GPS-Spuren in / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Beispiel für adb pullund adb pushvon rekursiven Verzeichnissen:

C:\Test>adb pull /data/misc/test/ .
pull: building file list...
pull: /data/misc/test/test1/test2/test.3 -> ./test1/test2/test.3
pull: /data/misc/test/test1/test2/test.2 -> ./test1/test2/test.2
pull: /data/misc/test/test1/test2/test.1 -> ./test1/test2/test.1
pull: /data/misc/test/test1/test.3 -> ./test1/test.3
pull: /data/misc/test/test1/test.2 -> ./test1/test.2
pull: /data/misc/test/test1/test.1 -> ./test1/test.1
pull: /data/misc/test/test.3 -> ./test.3
pull: /data/misc/test/test.2 -> ./test.2
pull: /data/misc/test/test.1 -> ./test.1
9 files pulled. 0 files skipped.
0 KB/s (45 bytes in 0.093s)

C:\Test>adb push . /data/misc/test/
push: ./test1/test2/test.3 -> /data/misc/test/test1/test2/test.3
push: ./test1/test2/test.2 -> /data/misc/test/test1/test2/test.2
push: ./test1/test2/test.1 -> /data/misc/test/test1/test2/test.1
push: ./test1/test.3 -> /data/misc/test/test1/test.3
push: ./test1/test.2 -> /data/misc/test/test1/test.2
push: ./test1/test.1 -> /data/misc/test/test1/test.1
push: ./test.3 -> /data/misc/test/test.3
push: ./test.2 -> /data/misc/test/test.2
push: ./test.1 -> /data/misc/test/test.1
9 files pushed. 0 files skipped.
0 KB/s (45 bytes in 0.062s)
Ofir Luzon
quelle
3
@kakyo Es funktioniert für Unterordner für mich. Überprüfen Sie, ob Sie die neueste ADB von Google haben. (Ich benutze 1.0.29)
Ofir Luzon
Ja, ich habe festgestellt, dass es am Ende für nicht leere Ordner funktioniert. Ich hatte einige leere Ordner, die nicht abgerufen wurden. Scheint "Push" auch nicht rekursiv zu sein?
Kakyo
@kakyo Ich habe die Ausgabe eines rekursiven Pull and Push zu meiner Antwort hinzugefügt. Sie haben Recht mit leeren Ordnern, sie werden nicht gezogen oder verschoben.
Ofir Luzon
1
Achtung: Mit ADB Pull verlieren die Dateien ihr ursprüngliches Änderungsdatum.
Stan
3
@Stan: Es sei denn, Sie verwenden die Option "-a" wie in "adb pull [-a] <remote> ... <local>", wodurch laut Datei der Zeitstempel und der Modus der Datei erhalten bleiben.
Rusty Gear
27

./adb pull /sdcard <- schlägt fehl

./adb pull /sdcard/ <- funktioniert rekursiv - beachten Sie den abschließenden Schrägstrich

Getestet mit Nexus 5 und adb heruntergeladen im März 2014.

Posting als Gast-Gast
quelle
1
Für mich funktionierte es rekursiv ohne den letzten Schrägstrich, adb Version 1.0.32
Antonio
Ich muss meine Gegenstimme zurücknehmen, weil @Antonio korrekt ist.
Shayan
7

Das Analysieren der Ausgabe von 'ls' ist im Allgemeinen eine schlechte Idee. Verwenden Sie stattdessen 'find'.

adb shell 'find /sdcard/ -name "gps*.trace" -print0' | xargs -0 -n 1 adb pull

Warum sollten Sie die Ausgabe von ls nicht analysieren?

ishmael
quelle
Auf meinem Computer musste ich den vollständigen Pfad zu adb verwenden, aber ansonsten funktionierte dies großartig!
Dan J
Diese Antwort ist eigentlich ziemlich klug. Gut gemacht!
Darth Egregious
6

Obwohl der adb pullBefehl den Ordnernamen für den Remote-Parameter akzeptiert, bevorzuge ich die Verwendung des tarBefehls. Es bietet mehr Flexibilität - ermöglicht Dateinamenmuster ( Einschließen und Ausschließen ), Symlink-Steuerung und behält Dateiberechtigungen bei. Seit Android 6.0 können Sie ein eingebautes verwenden. Vorher mussten Sie Tools von Drittanbietern verwenden wie busybox:

adb exec-out tar c sdcard/amazonmp3 > amazon.tar

Stellen Sie sicher, dass Sie die Führung /auf Ihrem Weg weglassen .

themuddler
quelle
Oh, es hat nicht funktioniert. tar -tvf sagt mir, dass das Ergebnis nicht wie ein Teerarchiv aussieht. Naja.
Themuddler
Sehr starker Weg! Das Problem sind jedoch Fehler / Warnungen wie "tar: Entfernen von führenden '/' aus Mitgliedsnamen", die der Ausgabedatei hinzugefügt wurden. Ich weiß nicht, wie ich das beseitigen soll.
x'ES
Ich bekomme 1,5 KB Datei auf der Ausgabe.
Shayan
5

Ich habe dies für Windows-Boxen erstellt. Es ist sehr nützlich, Dateien mit Platzhaltern zu übertragen, ohne das Dateisystem zu mounten. Sie können dieses Skript irgendwo in Ihre Pfadumgebung aufnehmen.

adbpull.bat

@echo off
setlocal enabledelayedexpansion
if %1.==. (
    echo Wilcard parameter is required.
    goto end
)
for /F "tokens=* USEBACKQ" %%F in (`adb shell ls %1`) do (
    set text=%%F
    set mfile=!text:~0,-1!
    adb pull "!mfile!"
)
:end
endlocal

Beispiel: adbpull /sdcard/DCIM/Camera/IMG_2016*

Cardeol
quelle
3

Directory Pull ist für neue Android-Tools verfügbar. (Ich weiß nicht, von welcher Version es hinzugefügt wurde, aber es funktioniert mit dem neuesten ADT 21.1)

adb pull /sdcard/Robotium-Screenshots
pull: building file list...
pull: /sdcard/Robotium-Screenshots/090313-110415.jpg -> ./090313-110415.jpg
pull: /sdcard/Robotium-Screenshots/090313-110412.jpg -> ./090313-110412.jpg
pull: /sdcard/Robotium-Screenshots/090313-110408.jpg -> ./090313-110408.jpg
pull: /sdcard/Robotium-Screenshots/090313-110406.jpg -> ./090313-110406.jpg
pull: /sdcard/Robotium-Screenshots/090313-110404.jpg -> ./090313-110404.jpg
5 files pulled. 0 files skipped.
61 KB/s (338736 bytes in 5.409s)
Palani
quelle
2

Aufbauend auf Davids Antwort finde ich das etwas besser:

adb shell ls /foo | tr -d '\r' | xargs -n1 adb pull

Es ist nicht nur ein Zeichen weniger zu tippen (große Sache), sondern wandelt das auch nicht -rin ein Leerzeichen um. Dies ist ein bedeutender Unterschied, als ob Sie es versuchen würden

adb shell ls /foo/myFile* | tr '\r' ' ' | xargs -i -n1 adb pull {} someDir

Sie erhalten eine Fehlermeldung

remote object '/foo/myFile1 ' does not exist

Stattdessen können Sie dies tun, was funktionieren wird:

adb shell ls /foo/myFile* | tr -d '\r' | xargs -i -n1 adb pull {} someDir 
FuriousGeorge
quelle
0

In meinem Fall funktionieren Platzhalter. Ich habe das folgende einfache Skript verwendet, um WhatsApp-Bilder meines virtuellen Geräts auf meinen Desktop zu importieren

#! /bin/bash
mkdir -p ~/Pictures/Pictures_adb
rm -f ~/Pictures/Pictures_adb/*
cd ~/Pictures/Pictures_adb
adb root
adb shell 'cp /data/media/0/WhatsApp/Media/WhatsApp\ Profile\ Photos/* /sdcard/Pictures/;exit'
adb pull /sdcard/Pictures
mv ~/Pictures/Pictures_adb/Pictures/* ~/Pictures/Pictures_adb/
rmdir ~/Pictures/Pictures_adb/Pictures
cd
srinivasu u
quelle
Sie verwenden Platzhalter für cp unter Android und nicht zum Ziehen auf dem Host. Deshalb funktioniert es. Gute Alternative, obwohl das Kopieren auf / sdcard / zusätzlichen Speicher kostet und private Dateien auf die SD-Karte verliert.
user905686
-3

In Android gibt es einige Ordner mit zugehörigen Berechtigungen! Einige Ordner gehören dem Root- oder Systembenutzer.

Ihr solltet die Berechtigungen dieser Dateien und Ordner ändern, bevor ihr "adb pull" macht.

Die folgenden Befehle könnten helfen:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Tim Long
quelle