web-dev-qa-db-fra.com

android: copie récursive avec push adb

Je pense que adb's Push est basé sur des fichiers. Je veux être capable de pousser des dossiers entiers. Y a-t-il un moyen facile sans script?

Merci!

Edit: Je dois travailler avec des sous-dossiers.

Edit: Il semblerait que pull adb soit récursif mais Push ne soit pas . J'ai donc changé le titre et la description en conséquence. 

47
kakyo

Essayez ceci (avec des sous-dossiers): adb Push mySourceFolder/. myDestAndroidFolder.

Les dossiers vides ne sont pas copiés sur un appareil Android.

78
Yura Shinkarev

adb pull, extrait tous les fichiers du répertoire spécifié:

$ adb pull /mnt/sdcard/
pull: building file list...
pull: /mnt/sdcard/t3.txt -> ./t3.txt
pull: /mnt/sdcard/t2.txt -> ./t2.txt
pull: /mnt/sdcard/t1.txt -> ./t1.txt
3 files pulled. 0 files skipped.

ou

$ adb Push . /mnt/sdcard/
Push: ./t2.txt -> /mnt/sdcard/t2.txt
Push: ./t3.txt -> /mnt/sdcard/t3.txt
Push: ./t1.txt -> /mnt/sdcard/t1.txt
3 files pushed. 0 files skipped.
22

Je vais creuser encore plus pour donner une solution complète à cela (pour Linux uniquement), parce que google redirige vers ceci et j'ai eu exactement le même problème. 

Avec un simple push adb, le problème est que tous les sous-répertoires doivent exister AVANT de faire le push, ce qui peut être très pénible à réaliser. 

Notez qu’une solution simple consiste à compresser le dossier, à appuyer sur le zip, puis à décompresser le périphérique. Mais disons que vous n'avez pas de décompression sur votre appareil (hautement improbable, vraiment).

Vous voulez envoyer une arborescence complète avec de nombreux sous-répertoires sur votre périphérique dans un répertoire vide myDirectory. Il y a deux étapes:

Commencez par créer tous les sous-répertoires de votre périphérique source:

cd <folder-containing-myDirectory>
find myDirectory/ -type d -exec adb Shell mkdir <path-to-folder-containing-myDirectory-in-device>/{} \;

Cette commande trouve tous les sous-répertoires de myDirectory (y compris.. Ainsi, si myDirectory existe déjà, vous aurez un message d'erreur que vous pouvez ignorer en toute sécurité) et pour chacun d'entre eux, créez le répertoire correspondant sur le périphérique.

puis tout pousser

adb Push myDirectory/. <path-to-folder>/myDirectory
18
autra

Je me rends compte que cette question est un peu vieille et je suis sur le point de mentionner le script quand la question l'excluait, mais je vais quand même répondre à cela. Principalement parce que j'aurais aimé trouver cette réponse ici, avant de devoir la résoudre moi-même.

adb Push SERA fonctionnera de manière récursive si tous les sous-dossiers sont déjà présents. Ils peuvent être vides, il semble juste qu'Adb Push ne puisse pas créer de dossiers. J'ai trouvé cette distinction utile car on pouvait exécuter une série de commandes comme celle-ci:

$ adb Shell mkdir /folder
$ adb Shell mkdir /folder/sub1
$ adb Shell mkdir /folder/sub2
$ adb Push folder

Donc, oui, on pourrait créer un petit script pour le faire automatiquement. Cependant, je pense que le point le plus important est qu’il faut simplement que les dossiers soient présents. Ce qui signifie que si c'est quelque chose que vous allez mettre à jour plusieurs fois dans le même dossier. Par exemple, ajouter des images à une structure de sous-dossiers existante fonctionnerait toujours très bien avec la commande Push adb unique.

4
user1449536

Pour développer un peu plus la réponse de génie de autra, j’ai créé un script rapide pour l’automatiser (pour Linux/Mac uniquement). 

J'ai créé un fichier vide dans mon répertoire personnel appelé adb-Push. Ensuite, j'ai édité le fichier avec un éditeur de texte (comme gedit, nano, vim, etc.) et y ai inséré le contenu suivant:

#!/bin/bash

# Usage:
# adb-Push <directory-on-computer-to-send> <directory-on-device-to-receive-it>
# Example:
# adb-Push ~/backups/DCIM /sdcard

src="${1}";
trgt="$(basename ${1})";
dst="$(echo "${2}" | grep '/$')";
# If ${dst} ends with '/', remove the trailing '/'.
if [ -n "${dst}" ]; then
    dst="${dst%/*}";
fi;

# If ${src} is a directory, make directories on device before pushing them.
if [ -d "${src}" ]; then
    cd "${src}";
    cd ..;
    trgt="${trgt}/";
    find "${trgt}" -type d -exec adb Shell mkdir "${dst}/{}" \;
fi;

adb Push "${src}" "${dst}/${trgt}";

Puis je l'ai rendu exécutable:

chmod +x ~/adb-Push;

Voici comment je le lance:

~/adb-Push <directory-on-computer-to-send> <directory-on-device-to-receive-it>

Par exemple, si je veux envoyer " ~/backups/DCIM " dans le dossier sdcard de mon périphérique, je procéderais ainsi:

~/adb-Push ~/backups/DCIM /sdcard

(Mais gardez à l'esprit que l'emplacement de la carte SD ne correspond pas à "/sdcard " pour chaque appareil Android. Par exemple, il pourrait s'agir de "/mnt/sdcard ".)

3
GreenRaccoon23

Nous avons également exploré cet article et trouvé cet article utile, mais nous avons peut-être trouvé une solution plus complète. Exécutez ce qui suit à partir du dossier contenant les fichiers/dossiers que vous voulez envoyer:

adb Push . /myDestinationFolder

La clé est apparemment le préfixe '/' devant le dossier de destination. Cela fonctionne à partir de l'invite de commande Windows, mais lorsque je l'exécute à partir de git bash (sous Windows), des erreurs se produisent en raison de la signification du '/' dans un chemin d'accès dans le shell bash. Cela pourrait donc ne pas fonctionner sous linux/bash, mais il a définitivement copié tous les sous-dossiers pour moi.

2
Corey Pendleton

Cela fait quelques années, les problèmes peuvent ne pas avoir changé, mais il s’agit toujours d’un PITA. Ce qui fonctionne pour moi sur linux est de créer un dossier temporaire, de créer un lien symbolique vers le (s) dossier (s) que je veux copier, puis d’adb Push. Il ignore le répertoire principal, mais copie les sous-répertoires. Actuellement, je n'ai pas besoin de créer de sous-répertoires, ils sont créés et copiés pour moi. Cela pourrait être spécifique à la plate-forme, je ne suis pas sûr. Mais le répertoire principal que je copie, il copie les fichiers qu'il contient à la place du répertoire. Ainsi, le répertoire temporaire est ignoré et les dossiers liés par un lien symbolique sont ensuite copiés. Exemple: mkdir tmp cd tmp ln -s ../Foo . ln -s ../Bar . cd .. adb Push tmp /sdcard/ Et il poussera Foo/fichier1 vers /sdcard/Foo/file1Avec juste adb Push Foo /./sdcard/puis je me retrouve avec/sdcard/file1, ce qui ne me rend pas heureux.

1
RubyPanther

Que diriez-vous de: archive -> Push -> extrait

1
Sharas
export FOLDER="Books"
TMPIFS="$IFS"
IFS=$'\n'
for i in `find "$FOLDER"/ -type d | sed 's,//\+,/,g'`; do
  adb Shell mkdir -p /mnt/sdcard/"$i"
done && \
adb Push "$FOLDER"/ /mnt/sdcard/"$FOLDER"
unset FOLDER
IFS="$TMPIFS"
0
mutanabbi