Як витягнути лише новіші файли з "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у відповідних місцях.


Це виглядає досить добре. Він також працює рекурсивно або просто в одному каталозі і не має підкаталогів?
OMA

Це дійсно не рекурсивно, але сміливо вдосконалюйтесь. :-)
Енн ван Россум

Також зауважте, що тут я ще не порівнюю дати, тому якщо ви змінили файли, вони не оновлюються.
Енн ван Россум

7

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


Хоча посилання, можливо, є відповіддю для цього користувача, найкраще повністю пояснити спосіб і процес, щоб пройти, щоб він працював. android.stackexchange.com/help/how-to-answer
acejavelin

Дякую за згадку. Мені довелося внести кілька змін у вихідний код, щоб змусити його працювати для мого випадку використання (недійсні шляхи для Windows, що спричиняють збій, невідповідність версії Python тощо). Детальніше див. Проблеми, про які я коментував), але це все-таки було єдиний спосіб мені вдалося отримати свої файли з пошкодженого розділу даних. (витягнення adb у всьому каталозі призведе до збоїв у різних файлах, і я не хотів вручну видаляти кожен, а потім перезапустити всю передачу - за допомогою adb-sync [+ мої модифікації] просто не вдасться один файл потім продовжуйте)
Венрікс

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.