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