Как вытащить только новые файлы с «adb pull»? (Утилита Android SDK)

13

С помощью команды «adb pull / sdcard /» я могу скопировать все содержимое внутренней памяти моего телефона Android в мой текущий локальный каталог (а «adb pull / mnt / extSdCard /» делает то же самое с внешней SD-картой). Но эта команда всегда копирует все, даже файлы, которые я уже сохранил локально.

Есть ли способ скопировать только новые и измененные файлы? (файлы с более новой датой)

OMA
источник

Ответы:

9

Как описано в ss-3-1415926535897932384626433, флаг отсутствует, но сначала нужно получить список файлов, а затем проверить, совпадают ли ваши локальные файлы. Я написал небольшой сценарий для этого:

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

Настройте удаленную папку rfolderи локальную папку lfolderв соответствии с местоположением по вашему выбору.

Энн ван Россум
источник
Это выглядит довольно хорошо. Это также работает рекурсивно или только в одном каталоге и без подкаталогов?
ОМА
Это действительно нерекурсивно, но не стесняйтесь улучшать. :-)
Энн ван Россум
Также обратите внимание, что я пока не сравниваю даты здесь, поэтому, если вы изменили файлы, они не будут обновлены.
Анна Ван Россум
7

adb-sync - небольшой, но мощный скрипт на python, который может выполнить все ваши запросы и многое другое ... https://github.com/google/adb-sync

Александр Савин
источник
Хотя ссылка может быть ответом для этого пользователя, лучше всего полностью объяснить метод и процесс, через который он должен работать. android.stackexchange.com/help/how-to-answer
acejavelin
Спасибо за упоминание. Мне пришлось внести несколько изменений в исходный код, чтобы он работал для моего варианта использования (неверные пути для Windows, вызывающие сбой, очевидно, несоответствие версии Python и т. Д. - подробности см. В комментариях, которые я комментировал), но в итоге это оказалось единственный способ получить мои файлы из поврежденного раздела данных. (извлечение adb всей директории может привести к сбою в различных файлах, и я не хочу вручную удалять каждый из них, а затем перезапускать всю передачу - с помощью adb-sync [+ мои модификации] просто произойдет сбой этого файла затем продолжить)
Venryx
4

adb pull кажется, не предоставляет флаг для извлечения выбранных файлов .

В качестве обходного пути вы можете сделать следующее: Используйте, adb shell [Unix shell command]чтобы скопировать выбранные файлы во временную папку, а затем извлечь все файлы из этой папки.

Обновление:
Вы можете использовать cp -u [source] [destination]команду оболочки unix для копирования только измененных файлов при последующем запуске. Вы также можете использовать -rфлаг, чтобы использовать его в рекурсивных подкаталогах, если это необходимо.

Android Quesito
источник
Спасибо за Ваш ответ. Копирование всех файлов в другое место для последующего обновления только одного измененного файла выполняется довольно медленно. Жаль, что adb не дает возможности копировать только новые файлы.
OMA
@OMA Вы можете использовать оболочку, чтобы получить список новых файлов, а затем использовать adb pullв этом списке.
Мэтью Читал
@ MatthewRead Любые советы о том, как это сделать? Спасибо!
OMA
@OMA Я не могу понять вашу проблему с этим. Используйте обе команды в одной строке или создайте псевдоним (также добавьте команду для очистки временного местоположения после операции). Если бы для этого был флаг adb pull, он работал бы так же.
Android Quesito,