Подтвердить что ты не робот

Android: Рекурсивная копия с помощью adb push

Я думаю, что adb push основан на файлах. Я хочу иметь возможность выталкивать целые папки. Есть ли простой способ без создания сценариев?

Спасибо!

Изменить: Мне нужно работать с подпапками.

Изменить: Кажется, что adb pull является рекурсивным, но push не является. Поэтому я изменил название и описание соответственно.

4b9b3361

Ответ 1

Попробуйте это (работает с подпапками): adb push mySourceFolder/. myDestAndroidFolder UPD: пустые папки не копируются на устройство Android.

Ответ 2

adb pull, вытаскивает все файлы в указанном каталоге:

$ 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.

или

$ 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.

Ответ 3

Я собираюсь копать это еще больше, чтобы дать полное решение для этого (только для Linux), потому что google перенаправляется на это, и у меня была такая же проблема.

С простым нажатием adb проблема заключается в том, что все подкаталоги должны существовать до того, как делать push, что может быть очень болезненно для достижения.

Обратите внимание, что простым решением является zip-папка, затем нажмите zip и разархивируйте на устройстве. Но пусть говорят, что у вас нет разархивирования на вашем устройстве (очень маловероятно, действительно).

Вы хотите направить полное дерево с большим количеством подкаталогов на ваше устройство в пустой каталог myDirectory. Существует два шага:

Сначала создайте все подкаталоги в исходном устройстве:

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

Эта команда найдет все подкаталоги myDirectory (в том числе., поэтому, если myDirectory уже существует, у вас будет одно сообщение об ошибке, которое можно безопасно игнорировать), и для каждого из них создайте соответствующий каталог на устройстве.

затем нажмите все

adb push myDirectory/. <path-to-folder>/myDirectory

Ответ 4

Я понимаю, что этот вопрос немного старый, и я собираюсь упомянуть сценарии, когда вопрос исключил его, но я все равно отвечу. В основном, потому что мне жаль, что я не нашел здесь этого ответа, прежде чем сам это решить.

adb push WILL работает рекурсивно, если все подпапки уже присутствуют. Они могут быть пустыми, просто кажется, что adb push не может создавать папки. Я нашел это полезным отличием, потому что можно было выполнить ряд команд, подобных этому:

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

Итак, да, можно сделать небольшую обертку script, чтобы сделать это автоматически. Однако, я думаю, что более важным моментом является то, что он просто требует наличия папок. Это означает, что если это то, что вы собираетесь обновлять несколько раз в одной папке. Например, добавление изображений в существующую структуру вложенных папок будет работать снова и снова с помощью одной команды push adb.

Ответ 5

Чтобы расширить на autra гениальный ответ немного, я сделал быстрый script, чтобы автоматизировать это (только для Linux/Mac).

Я создал пустой файл в домашнем каталоге adb-push. Затем я редактировал файл с помощью текстового редактора (например, gedit, nano, vim и т.д.) И добавлял в него следующее содержимое:

#!/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}";

Затем я сделал его исполняемым:

chmod +x ~/adb-push;

Вот как я его запускаю:

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

Например, если я хочу отправить "~/backups/DCIM" в папку sdcard моего устройства, я бы сделал следующее:

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

(Но имейте в виду, что расположение SD-карты не является "/sdcard" для каждого Android-устройства. Например, это может быть "/mnt/sdcard".)

Ответ 6

В этом тоже участвовал и нашел эту статью полезной, но, возможно, нашел более полное решение. Выполнение следующего из папки, содержащей файлы/папки, которые вы хотите нажать:

adb push . /myDestinationFolder

Ключом является префикс '/' перед папкой назначения. Это работает из командной строки Windows, но когда я запускаю ее из git bash (в Windows), я получаю некоторые ошибки из-за значения "/" в пути в оболочке bash. Так что это может не работать из linux/bash, однако он определенно скопировал все подпапки для меня.

Ответ 7

Прошло несколько лет, проблемы могут быть или не быть изменены, но это все еще PITA. То, что работает для меня в Linux, - создать временную папку, создать символическую ссылку на папки, которые я хочу скопировать, а затем я нажимаю adb. Он игнорирует основной каталог, но копирует поддиры. В настоящее время мне не нужно создавать какие-либо поддиры, они создаются и копируются для меня. Это может быть специфично для платформы, я не уверен. Но главный каталог, который я копирую, он копирует файлы в нем вместо каталога. Таким образом, temp dir игнорируется, а затем копируются скопированные символьные папки.

Пример:

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

И он нажимает Foo/file1 на /sdcard/Foo/file1. Только с adb push Foo/. /sdcard/ я получаю /sdcard/file1, что не делает меня счастливым.

Ответ 8

Как насчет: архив → push → extract

Ответ 9

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"