Como extrair apenas arquivos mais novos com o "adb pull"? (Utilitário SDK do Android)


12

Com o comando "adb pull / sdcard /", posso copiar todo o conteúdo da memória interna do meu telefone Android para o meu diretório local atual (e "adb pull / mnt / extSdCard /" faz o mesmo com o cartão SD externo). Mas esse comando sempre copia tudo, mesmo os arquivos que eu já armazenei localmente.

Existe alguma maneira de copiar apenas arquivos novos e modificados? (arquivos com uma data mais recente)

Respostas:


8

Conforme descrito por ss-3-1415926535897932384626433, não há sinalizador, mas é necessário obter uma lista de arquivos primeiro e depois verificar se os arquivos locais correspondem. Eu escrevi um pequeno roteiro para isso:

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

Ajuste a pasta remota rfoldere a pasta local lfolderpara os locais de sua escolha.


Isso parece muito bom. Também funciona recursivamente ou apenas em um único diretório e sem subdiretórios?
OMA

Isso não é recursivo, mas fique à vontade para melhorar. :-)
Anne van Rossum

Observe também que ainda não comparo datas aqui; portanto, se você alterou os arquivos, eles não serão atualizados.
Anne van Rossum

6

adb-sync - pequeno, mas poderoso script python que pode fazer tudo o que você pede e mais ... https://github.com/google/adb-sync


Embora o link possa ser a resposta para esse usuário, é melhor explicar completamente o método e o processo a seguir para fazê-lo funcionar. android.stackexchange.com/help/how-to-answer
acejavelin

Obrigado pela menção. Eu tive que fazer várias alterações no código fonte para fazê-lo funcionar no meu caso de uso (caminhos inválidos para o Windows causando falha, aparentemente incompatibilidade de versão do Python etc.) - para obter detalhes, veja os problemas nos quais comentei), mas acabou sendo a única maneira de recuperar meus arquivos de uma partição de dados corrompida. (o adb pull do diretório inteiro trava em vários arquivos, e eu não queria excluir manualmente cada um deles e reiniciar toda a transferência - com o adb-sync [+ minhas modificações], apenas um arquivo falharia. então continue)
Venryx

4

adb pull parece não fornecer um sinalizador para puxar os arquivos selecionados .

Como solução alternativa, você pode fazer o seguinte: Use adb shell [Unix shell command]para copiar os arquivos selecionados para um local temporário e, em seguida, retire todos os arquivos desse local.

Atualização:
Você pode usar o cp -u [source] [destination]comando shell unix para copiar apenas arquivos modificados na execução subsequente. Você também pode usar o -rsinalizador para usá-lo em subdiretórios recursivos, se necessário.


Obrigado pela sua resposta. Copiar todos os arquivos para outro local para talvez atualizar apenas um arquivo alterado é muito lento. Pena que o adb não é uma maneira de copiar apenas arquivos mais recentes.
OMA

@OMA Você pode usar o shell para obter uma lista de novos arquivos e usá adb pull-lo nessa lista.
Matthew Leia

@MatthewRead Alguma dica de como fazer isso? Obrigado!
OMA

@OMA Não consigo entender o seu problema com isso. Use os dois comandos em uma linha ou crie um alias (também adicione um comando para limpar o local temporário após a operação). Se houvesse uma bandeira de adb pull para isso, funcionaria da mesma maneira.
Android Quesito 02/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.