Wie ziehe ich nur neuere Dateien mit "adb pull"? (Android SDK-Dienstprogramm)

12

Mit dem Befehl "adb pull / sdcard /" kann ich den gesamten Inhalt des internen Speichers meines Android-Telefons in mein aktuelles lokales Verzeichnis kopieren (und "adb pull / mnt / extSdCard /" macht dasselbe mit der externen SD-Karte). Aber dieser Befehl kopiert immer alles, auch Dateien, die ich bereits lokal gespeichert habe.

Gibt es eine Möglichkeit, nur neue und geänderte Dateien zu kopieren? (Dateien mit einem neueren Datum)

OMA
quelle

Antworten:

8

Wie von ss-3-1415926535897932384626433 beschrieben, gibt es kein Flag, aber Sie müssen zuerst eine Liste der Dateien abrufen und dann prüfen, ob Ihre lokalen Dateien übereinstimmen. Ich habe ein kleines Skript dafür geschrieben:

#!/bin/sh

rfolder=/sdcard/DCIM/Camera
lfolder=Camera

adb shell ls "$rfolder" > android.files

ls -1 "$lfolder" > local.files

rm -f update.files
touch update.files

while IFS=  read -r q; do
  # Remove non-printable characters (are not visible on console)
  l=$(echo ${q} | sed 's/[^[:print:]]//')
  # Populate files to update
  if ! grep -q "$l" local.files; then         
    echo "$l" >> update.files
  fi  
done < android.files

script_dir=$(pwd)
cd $lfolder

while IFS=  read -r q; do
  # Remove non-printable characters (are not visible on console)
  l=$(echo ${q} | sed 's/[^[:print:]]//')
  echo "Get file: $l"
  adb pull "$rfolder/$l"
done < "${script_dir}"/update.files

Passen Sie den Remote-Ordner rfolderund den lokalen Ordner lfolderan Speicherorte Ihrer Wahl an.

Anne van Rossum
quelle
Das sieht ziemlich gut aus. Funktioniert es auch rekursiv oder nur in einem einzigen Verzeichnis und ohne Unterverzeichnisse?
OMA
Dies ist zwar nicht rekursiv, kann aber jederzeit verbessert werden. :-)
Anne van Rossum
Beachten Sie auch, dass ich hier noch keine Daten vergleiche. Wenn Sie also Dateien geändert haben, werden diese nicht aktualisiert.
Anne van Rossum
6

adb-sync - kleines, aber leistungsstarkes Python-Skript, das all Ihre Fragen und mehr erfüllt ... https://github.com/google/adb-sync

Александр Савин
quelle
Obwohl der Link möglicherweise die Antwort für diesen Benutzer ist, ist es am besten, die Methode und den Prozess vollständig zu erläutern, damit er funktioniert. android.stackexchange.com/help/how-to-answer
acejavelin
Danke für die Erwähnung. Ich musste einige Änderungen am Quellcode vornehmen, damit er für meinen Anwendungsfall funktioniert (ungültige Pfade für Windows, die Absturz verursachen, anscheinend nicht mit der Python-Version übereinstimmen usw. - Einzelheiten siehe Probleme, die ich kommentiert habe), aber es endete damit Nur so konnte ich meine Dateien von einer beschädigten Datenpartition abrufen. (Der ADB-Pull des gesamten Verzeichnisses würde bei verschiedenen Dateien abstürzen, und ich wollte nicht jede manuell löschen und dann die gesamte Übertragung neu starten - mit adb-sync [+ meine Änderungen] würde nur diese eine Datei fehlschlagen dann weiter)
Venryx
4

adb pull scheint kein Flag zum Abrufen ausgewählter Dateien bereitzustellen .

Um dies zu umgehen, können Sie Folgendes tun: Verwenden Sie diese Option, adb shell [Unix shell command]um ausgewählte Dateien an einen temporären Speicherort zu kopieren und dann alle Dateien von diesem Speicherort abzurufen.

Update:
Sie können den cp -u [source] [destination]Unix-Shell-Befehl verwenden, um beim nächsten Ausführen nur geänderte Dateien zu kopieren. Sie können das -rFlag auch verwenden , um es in rekursiven Unterverzeichnissen zu verwenden, falls dies erforderlich ist.

Android Quesito
quelle
Danke für deine Antwort. Das Kopieren aller Dateien an einen anderen Speicherort, um dann möglicherweise nur eine geänderte Datei zu aktualisieren, ist ziemlich langsam. Schade, dass adb nicht vorsieht, nur neuere Dateien zu kopieren.
OMA
@OMA Sie können die Shell verwenden, um eine Liste neuer Dateien abzurufen und diese dann adb pullin dieser Liste zu verwenden.
Matthew Read
@MatthewRead Irgendwelche Tipps, wie das geht? Vielen Dank!
OMA
@OMA Ich kann Ihr Problem damit nicht verstehen. Verwenden Sie beide Befehle in einer Zeile oder erstellen Sie einen Alias ​​(fügen Sie auch einen Befehl hinzu, um den temporären Speicherort nach dem Vorgang zu löschen). Wenn es dafür eine adb pull-Flagge gäbe, würde es genauso funktionieren.
Android Quesito