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


13

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

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

Ответы:


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флаг, чтобы использовать его в рекурсивных подкаталогах, если это необходимо.


Спасибо за Ваш ответ. Копирование всех файлов в другое место для последующего обновления только одного измененного файла выполняется довольно медленно. Жаль, что adb не дает возможности копировать только новые файлы.
OMA

@OMA Вы можете использовать оболочку, чтобы получить список новых файлов, а затем использовать adb pullв этом списке.
Мэтью Читал

@ MatthewRead Любые советы о том, как это сделать? Спасибо!
OMA

@OMA Я не могу понять вашу проблему с этим. Используйте обе команды в одной строке или создайте псевдоним (также добавьте команду для очистки временного местоположения после операции). Если бы для этого был флаг adb pull, он работал бы так же.
Android Quesito,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.