¿Cómo extraer solo los archivos más nuevos con "adb pull"? (Utilidad SDK de Android)

12

Con el comando "adb pull / sdcard /" puedo copiar todo el contenido de la memoria interna de mi teléfono Android en mi directorio local actual (y "adb pull / mnt / extSdCard /" hace lo mismo con la tarjeta SD externa). Pero ese comando siempre copia todo, incluso los archivos que ya he almacenado localmente.

¿Hay alguna forma de copiar solo archivos nuevos y modificados? (archivos con una fecha más reciente)

OMA
fuente

Respuestas:

8

Como se describe en ss-3-1415926535897932384626433 no hay bandera, pero primero debe obtener una lista de archivos y luego verificar si sus archivos locales coinciden. Escribí un pequeño guión para ello:

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

Ajuste la carpeta remota rfoldery la carpeta local lfoldera las ubicaciones que elija.

Anne van Rossum
fuente
Esto se ve bastante bien. ¿Funciona también de forma recursiva o solo en un único directorio y sin subdirectorios?
OMA
De hecho, esto no es recursivo, pero siéntase libre de mejorar. :-)
Anne van Rossum
También tenga en cuenta que todavía no comparo las fechas aquí, por lo que si ha modificado archivos, no se actualizarán.
Anne van Rossum
6

adb-sync: script python pequeño pero potente que puede hacer todo lo que le pidas y más ... https://github.com/google/adb-sync

Александр Савин
fuente
Aunque el enlace puede ser la respuesta para este usuario, es mejor explicar completamente el método y el proceso que debe seguir para que funcione. android.stackexchange.com/help/how-to-answer
acejavelin
Gracias por la mención Tuve que hacer varios cambios en el código fuente para que funcionara para mi caso de uso (rutas no válidas para Windows que causan fallas, aparentemente no coinciden las versiones de Python, etc. - para más detalles, vea los problemas que comenté), pero terminó siendo la única forma en que pude recuperar mis archivos de una partición de datos corrupta. (la extracción de adb de todo el directorio se bloquearía en varios archivos, y no quería tener que eliminar manualmente cada uno y luego reiniciar toda la transferencia; con adb-sync [+ mis modificaciones] simplemente fallaría ese archivo luego continuar)
Venryx
4

adb pull no parece proporcionar una bandera para extraer los archivos seleccionados .

Como solución alternativa, puede hacer esto: usar adb shell [Unix shell command]para copiar los archivos seleccionados a una ubicación temporal y luego extraer todos los archivos de esa ubicación.

Actualización:
puede usar el cp -u [source] [destination]comando de shell de Unix para copiar solo los archivos modificados en la ejecución posterior. También puede usar -rflag para usarlo en subdirectorios recursivos, si es necesario.

Android Quesito
fuente
Gracias por tu respuesta. Copiar todos los archivos a otra ubicación para luego actualizar solo un archivo modificado es bastante lento. Lástima que adb no proporcione la forma de copiar solo archivos más nuevos.
OMA
@OMA Puede usar el shell para obtener una lista de archivos nuevos y luego usar adb pullen esa lista.
Matthew leyó
@MatthewRead ¿Alguna pista sobre cómo hacer eso? ¡Gracias!
OMA
@OMA No puedo entender tu problema con esto. Use ambos comandos en una línea o cree un alias (también agregue un comando para purgar la ubicación temporal después de la operación). Si hubiera una bandera de adb pull para eso, funcionaría de la misma manera.
Android Quesito