Jak pobierać tylko nowsze pliki za pomocą „adb pull”? (Narzędzie Android SDK)

13

Za pomocą polecenia „adb pull / sdcard /” mogę skopiować całą zawartość pamięci wewnętrznej mojego telefonu z Androidem do mojego bieżącego katalogu lokalnego (a „adb pull / mnt / extSdCard /” robi to samo z zewnętrzną kartą SD). Ale to polecenie zawsze kopiuje wszystko, nawet pliki, które już zapisałem lokalnie.

Czy istnieje sposób kopiowania tylko nowych i zmodyfikowanych plików? (pliki z nowszą datą)

OMA
źródło

Odpowiedzi:

9

Zgodnie z opisem w ss-3-1415926535897932384626433 nie ma flagi, ale najpierw trzeba uzyskać listę plików, a następnie sprawdzić, czy pliki lokalne są zgodne. Napisałem dla niego mały skrypt:

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

Dostosuj folder zdalny rfolderi folder lokalny lfolderdo wybranych przez siebie lokalizacji.

Anne van Rossum
źródło
To wygląda całkiem nieźle. Czy działa również rekurencyjnie, czy tylko w jednym katalogu i bez podkatalogów?
OMA
To rzeczywiście nie jest rekurencyjne, ale możesz je poprawić. :-)
Anne van Rossum,
Pamiętaj też, że nie porównuję jeszcze dat tutaj, więc jeśli zmieniłeś pliki, nie zostaną zaktualizowane.
Anne van Rossum,
7

adb-sync - mały, ale potężny skrypt Pythona, który może wykonać wszystkie pytania i wiele więcej ... https://github.com/google/adb-sync

Александр Савин
źródło
Chociaż link może być odpowiedzią dla tego użytkownika, najlepiej jest w pełni wyjaśnić metodę i proces, aby przejść, aby działało. android.stackexchange.com/help/how-to-answer
acejavelin
Dzięki za wzmiankę. Musiałem wprowadzić kilka zmian w kodzie źródłowym, aby działał w moim przypadku użycia (niepoprawne ścieżki dla systemu Windows powodujące awarię, najwyraźniej niezgodność wersji w języku Python itp. - aby uzyskać szczegółowe informacje, zobacz problemy, które skomentowałem), ale ostatecznie jedynym sposobem, w jaki mogłem odzyskać moje pliki z uszkodzonej partycji danych. (ściągnięcie adb całego katalogu spowodowałoby awarię różnych plików i nie chciałem ręcznie usuwać każdego z nich, a następnie ponownie uruchamiać całego transferu - z adb-sync [+ moimi modyfikacjami] po prostu zawiodłby ten jeden plik następnie kontynuuj)
Venryx
4

adb pull nie wydaje się dostarczać flagi do pobierania wybranych plików .

Aby obejść ten problem, możesz to zrobić: Użyj, adb shell [Unix shell command]aby skopiować wybrane pliki do tymczasowej lokalizacji, a następnie pobrać wszystkie pliki z tej lokalizacji.

Aktualizacja:
Możesz użyć cp -u [source] [destination]polecenia powłoki unix, aby skopiować tylko zmodyfikowane pliki przy kolejnym uruchomieniu. Możesz także użyć -rflagi, aby użyć go w podkatalogach rekurencyjnych, jeśli jest to wymagane.

Android Quesito
źródło
Dzięki za odpowiedź. Kopiowanie wszystkich plików do innej lokalizacji, aby następnie zaktualizować tylko jeden zmieniony plik, jest dość powolne. Szkoda, że ​​adb nie zapewnia kopiowania tylko nowszych plików.
OMA
@OMA Możesz użyć powłoki, aby uzyskać listę nowych plików, a następnie użyć jej adb pullna tej liście.
Mateusz
@MatthewRead Wszelkie wskazówki, jak to zrobić? Dzięki!
OMA
@OMA Nie mogę zrozumieć twojego problemu z tym. Użyj obu poleceń w jednym wierszu lub utwórz alias (dodaj także polecenie, aby wyczyścić lokalizację temp. Po operacji). Gdyby była do tego flaga adb pull, działałoby to w ten sam sposób.
Android Quesito