android: copie Récursive avec adb push

je pense que la poussée d'adb est basée sur les fichiers. Je veux être capable de pousser des dossiers entiers. Est-il un moyen facile sans script?

Merci!

Modifier: J'ai besoin de travailler avec des sous-dossiers.

Modifier: Il semble que la traction adb soit récursive mais push ne l'est pas. J'ai donc modifié le titre et la description en conséquence.

43
demandé sur kakyo 2012-10-30 22:57:47

9 réponses

Essayez ceci (qui a travaillé avec des sous-dossiers): adb push mySourceFolder/. myDestAndroidFolder.

les dossiers vides ne copient pas sur android device.

71
répondu Yura Shinkarev 2018-04-24 14:49:43

adb pull, tire tous les fichiers dans le 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
répondu Diego Torres Milano 2012-10-30 20:50:25

je vais creuser encore plus pour donner une solution complète (pour linux seulement), parce que google rediriger vers cela, et j'ai eu exactement ce même problème.

avec une simple poussée adb, le problème est que tous les sous-répertoires doivent exister avant de faire la poussée, ce qui peut être très douloureux à réaliser.

Notez qu'une solution facile est de compresser le dossier, poussez le zip à décompresser sur l'appareil. Mais disons que vous n'avez pas unzip sur votre appareil (très improbable, vraiment.)

Vous voulez pousser un arbre complet avec beaucoup de sous-répertoires de votre appareil dans un répertoire vide monrépertoire. Il y a deux étapes :

tout d'Abord créer tous les sous-répertoires, dans 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 ., donc si monrépertoire existe déjà, vous aurez un message d'erreur vous pouvez ignorer en toute sécurité) et pour chacun d'eux, de créer le répertoire correspondant sur le appareil.

alors poussez tout

adb push myDirectory/. <path-to-folder>/myDirectory
15
répondu autra 2017-08-25 05:31:33

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 répondre à cela de toute façon. Surtout parce que j'aurais aimé trouver cette réponse ici, avant d'avoir à la trouver moi-même.

ADB push fonctionnera de façon récursive, si tous les sous-dossiers sont déjà présents. Ils peuvent être vides, il semble juste que adb push ne peut pas faire des dossiers. J'ai trouvé ceci pour être une distinction utile parce qu'on peut exécuter une série de commandes comme ceci:

$ adb shell mkdir /folder
$ adb shell mkdir /folder/sub1
$ adb shell mkdir /folder/sub2
$ adb push folder

Donc, oui, on pourrait faire un petit script pour faire cela automatiquement. Cependant, je pense que le point le plus important est qu'il exige juste les dossiers pour être là. Ce qui signifie que si ce est quelque chose que vous allez mettre à jour plusieurs fois dans le même dossier. Par exemple, ajouter des images à une structure de sous-dossier existante fonctionnerait très bien encore et encore avec la commande simple ADB push.

5
répondu user1449536 2013-03-17 06:18:54

Pour développer sur autra'génie de la réponse un peu, j'ai fait un rapide de script pour automatiser ce (pour Linux/Mac uniquement).

j'ai créé un fichier vide dans mon répertoire home appelé adb-push. Puis j'ai édité le fichier avec un éditeur de texte comme gedit, nano, vim, etc.) et de mettre 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="";
trgt="$(basename )";
dst="$(echo "" | 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;

C'est comment je le lance:

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

Par exemple, si je veux envoyer " ~ / sauvegardes/DCIM" de mon appareil dossier sdcard, je voudrais faire ceci:

~/adb-push ~/backups/DCIM /sdcard

(Mais gardez à l'esprit que l'emplacement de la carte sd n'est pas " / sdcard" pour chaque appareil Android. Par exemple, il pourrait être " / mnt/sdcard" à la place.)

3
répondu GreenRaccoon23 2015-10-23 06:30:39

a Couru dans cette ainsi et trouvé cet article utile, mais peut-être trouvé une solution plus complète. Exécuter ce qui suit à partir du dossier contenant les fichiers/dossiers que vous voulez pousser:

adb push . /myDestinationFolder

La clé est le préfixe " / " avant le dossier de destination, apparemment. Cela fonctionne depuis mon invite de commande windows, mais quand je l'exécute depuis git bash (sur Windows), j'obtiens quelques erreurs dues à la signification du '/' dans un chemin à l'intérieur de l'interpréteur de commandes bash. Donc, cela pourrait ne pas fonctionner de linux / bash, cependant il a certainement copié tous les sous-dossiers pour moi.

2
répondu Corey Pendleton 2015-08-05 21:59:55

Cela fait quelques années, les enjeux peuvent ou non avoir changé, mais c'est toujours un PITA. Ce qui fonctionne pour moi sur linux est de créer un dossier temporaire, créer un lien symbolique vers le(S) dossier (s) que je veux copier, puis je pousse adb. Il ignore le dir principal, mais copie les sous-DIR. Actuellement, je n'ai pas besoin de créer des sous-répertoires, ils sont créés et copiés pour moi. Ça pourrait être spécifique à la plateforme, Je ne suis pas sûr. Mais le dir principal que je copie, il copie les fichiers qu'il contient au lieu du dir. De sorte que le temp dir est ignoré, et les dossiers symlinked sont ensuite copiés.

Exemple:

mkdir tmp
cd tmp
ln -s ../Foo .
ln -s ../Bar .
cd ..
adb push tmp /sdcard/

Et il va le pousser Foo/file1/sdcard/Foo/file1. Avec juste adb push Foo/. /sdcard/ puis-je /sdcard/file1 ce qui ne me rend pas heureux.

1
répondu RubyPanther 2015-04-08 20:24:16

Comment sur: archive -> commande -> extrait

0
répondu Sharas 2015-06-24 20:14:59
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
répondu mutanabbi 2015-07-14 04:25:30