Comment extraire uniquement des fichiers plus récents avec «adb pull»? (Utilitaire Android SDK)

12

Avec la commande "adb pull / sdcard /" je peux copier tout le contenu de la mémoire interne de mon téléphone Android dans mon répertoire local actuel (et "adb pull / mnt / extSdCard /" fait de même avec la carte SD externe). Mais cette commande copie toujours tout, même les fichiers que j'ai déjà stockés localement.

Existe-t-il un moyen de copier uniquement les fichiers nouveaux et modifiés? (fichiers avec une date plus récente)

OMA
la source

Réponses:

8

Comme décrit par ss-3-1415926535897932384626433, il n'y a pas d'indicateur, mais vous devez d'abord obtenir une liste de fichiers, puis vérifier si vos fichiers locaux correspondent. J'ai écrit un petit script pour ça:

#!/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

Ajustez le dossier distant rfolderet le dossier local lfolderaux emplacements de votre choix.

Anne van Rossum
la source
Cela semble assez bon. Fonctionne-t-il également récursivement ou simplement dans un seul répertoire et sans sous-répertoires?
OMA
Ce n'est pas récursif en effet, mais n'hésitez pas à vous améliorer. :-)
Anne van Rossum
Notez également que je ne compare pas encore les dates ici, donc si vous avez modifié des fichiers, ils ne seront pas mis à jour.
Anne van Rossum
6

adb-sync - petit script python puissant qui peut faire tout ce que vous demandez et plus encore ... https://github.com/google/adb-sync

Александр Савин
la source
Bien que le lien soit peut-être la réponse pour cet utilisateur, il est préférable d'expliquer complètement la méthode et le processus à suivre pour le faire fonctionner. android.stackexchange.com/help/how-to-answer
acejavelin
Merci pour la mention. J'ai dû apporter plusieurs modifications au code source pour le faire fonctionner pour mon cas d'utilisation (chemins d'accès non valides pour Windows provoquant un crash, incompatibilité de version Python apparemment, etc. - pour plus de détails, voir les problèmes dans lesquels j'ai commenté), mais il a fini par être la seule façon dont j'ai pu récupérer mes fichiers à partir d'une partition de données corrompue. (le pull adb de tout le répertoire plantait sur divers fichiers, et je ne voulais pas avoir à supprimer manuellement chacun puis redémarrer tout le transfert - avec adb-sync [+ mes modifications] il échouerait simplement ce fichier puis continuez)
Venryx
4

adb pull ne semble pas fournir d'indicateur pour extraire les fichiers sélectionnés .

Pour résoudre ce problème, vous pouvez procéder comme suit: Utilisez adb shell [Unix shell command]pour copier les fichiers sélectionnés vers un emplacement temporaire, puis extrayez tous les fichiers de cet emplacement.

Mise à jour:
vous pouvez utiliser la cp -u [source] [destination]commande shell unix pour copier uniquement les fichiers modifiés lors de l'exécution suivante. Vous pouvez également utiliser l' -rindicateur pour l'utiliser sur des sous-répertoires récursifs, si nécessaire.

Android Quesito
la source
Merci pour votre réponse. Copier tous les fichiers vers un autre emplacement pour ensuite mettre à jour un seul fichier modifié est assez lent. Dommage que adb ne prévoie pas de copier uniquement les fichiers les plus récents.
OMA
@OMA Vous pouvez utiliser le shell pour obtenir une liste de nouveaux fichiers, puis utiliser adb pullsur cette liste.
Matthew Read
@MatthewRead Des conseils sur la façon de procéder? Merci!
OMA
@OMA Je n'arrive pas à comprendre votre problème avec cela. Utilisez les deux commandes sur une seule ligne ou créez un alias (ajoutez également une commande pour purger l'emplacement temporaire après l'opération). S'il y avait un drapeau de traction adb pour cela, cela fonctionnerait de la même manière.
Android Quesito