Intereting Posts
Предлагает ли Google API, который я могу использовать для получения адреса моего телефона? Как отключить прокрутку просмотра ресайклеров, чтобы он прослушивал макет Scrollview? Рисование зеркальных растровых изображений в android Как создать Gmail как окно поиска в панели действий? Почему неуправляемый apk нужен? Как читать файл из res / raw по имени Как сделать значок пусковой установки Android Не удалось выполнить «play» в «HTMLMediaElement»: API может быть инициирован только жестом пользователя Как я могу изменить текст EditText без запуска Text Watcher? Рекомендации по использованию токена для Android OAuth2 Увеличьте значение символа на единицу Android: проблемы расчета ориентации устройства Android – Как запустить Google Map в Android-приложении с определенным местоположением, уровнем масштабирования и маркером Ссылка на веб-страницу для открытия приложения instagram Android Studio и MonkeyTalk?

Как скопировать и отредактировать файлы в оболочке Android?

В оболочке Android отсутствует команда cp . В оболочке Android также нет sed или grep или vi . У меня нет демона adb . Существует команда mv, но она отказывается работать, если источник находится на устройстве только для чтения.

  1. Что делать, если мне придется рекурсивно копировать некоторые каталоги из устройства только для чтения?
  2. Как изменить строку в текстовом файле (например, «PATH = / cache» будет «PATH = / mnt / asec»)?

Solutions Collecting From Web of "Как скопировать и отредактировать файлы в оболочке Android?"

Самый общий ответ на этот вопрос прост: соедините несколько приложений (busybox?) С APK (при условии, что вы хотите использовать его в приложении). Насколько мне известно, раздел / data не установлен noexec, и даже если вы не хотите развертывать полноценный APK, вы можете изменить источники ConnectBot для создания APK с включенным набором инструментов командной строки.

Для инструментов командной строки я рекомендую использовать crosstool-ng и создать набор статически связанных инструментов (связанных с uClibc). Они могут быть большими, но они определенно будут работать.

Чтобы скопировать dirs, кажется, вы можете использовать adb pull <remote> <local> если вы хотите скопировать файл / dir с устройства и adb push <local> <remote> чтобы скопировать файл / директорию на устройство. Кроме того, чтобы скопировать файл, вы можете использовать простой трюк: cat source_file > dest_file . Обратите внимание, что это не работает для недоступных пользователем путей.

Чтобы редактировать файлы, я не нашел простого решения, просто некоторые возможные обходные пути. Попробуйте это , кажется, вы можете (после установки) использовать его для редактирования файлов, таких как busybox vi <filename> . Нано, похоже, тоже можно использовать .

Вы можете сделать это без прав root:

 cat srcfile > /sdcard/dstfile 

Вы можете использовать cat > filename для использования стандартного ввода для записи в файл. В конце вы должны поместить EOF CTRL+D

Также, если целью является только доступ к файлам на телефоне. Существует Проводник, доступный с точки зрения Eclipse DDMS. Он позволяет копировать файл с устройства и на него. Таким образом, вы всегда можете получить файл, изменить его и вернуть обратно на устройство. Конечно, он позволяет получить доступ только к файлам, которые не защищены от чтения.

Если вы не видите File Explorer, с точки зрения DDMS, зайдите в «Окно» -> «Показать вид» -> «Проводник».

Поскольку политика разрешений на моем устройстве несколько параноидальная (не может adb pull данные приложения adb pull ), я написал сценарий для копирования файлов рекурсивно.

Примечание: этот рекурсивный сценарий копирования файлов / папок предназначен для Android!

Copy-r :

 #! /system/bin/sh src="$1" dst="$2" dir0=`pwd` myfind() { local fpath=$1 if [ -e "$fpath" ] then echo $fpath if [ -d "$fpath" ] then for fn in $fpath/* do myfind $fn done fi else : echo "$fpath not found" fi } if [ ! -z "$dst" ] then if [ -d "$src" ] then echo 'the source is a directory' mkdir -p $dst if [[ "$dst" = /* ]] then : # Absolute path else # Relative path dst=`pwd`/$dst fi cd $src echo "COPYING files and directories from `pwd`" for fn in $(myfind .) do if [ -d $fn ] then echo "DIR $dst/$fn" mkdir -p $dst/$fn else echo "FILE $dst/$fn" cat $fn >$dst/$fn fi done echo "DONE" cd $dir0 elif [ -f "$src" ] then echo 'the source is a file' srcn="${src##*/}" if [ -z "$srcn" ] then srcn="$src" fi if [[ "$dst" = */ ]] then mkdir -p $dst echo "copying $src" '->' "$dst/$srcn" cat $src >$dst/$srcn elif [ -d "$dst" ] then echo "copying $src" '->' "$dst/$srcn" cat $src >$dst/$srcn else dstdir=${dst%/*} if [ ! -z "$dstdir" ] then mkdir -p $dstdir fi echo "copying $src" '->' "$dst" cat $src >$dst fi else echo "$src is neither a file nor a directory" fi else echo "Use: copy-r src-dir dst-dir" echo "Use: copy-r src-file existing-dst-dir" echo "Use: copy-r src-file dst-dir/" echo "Use: copy-r src-file dst-file" fi 

Здесь я предоставляю источник легкого find для Android, потому что на некоторых устройствах эта утилита отсутствует. Вместо myfind можно использовать find , если он определен на устройстве.

Монтаж:

 $ adb push copy-r /sdcard/ 

Запуск в adb shell (с корнем):

 # . /sdcard/copy-r files/ /sdcard/files3 

или

 # source /sdcard/copy-r files/ /sdcard/files3 

(Хеш # выше – это приглашение su , а . – это команда, которая заставляет оболочку запускать указанный файл, почти такой же, как source ).

После копирования я могу adb pull файлы с SD-карты.

Запись файлов в каталог приложения была сложнее, я пытался установить r / w разрешения на files и подкаталоги, это не сработало (ну, это позволило мне читать, но не писать, что странно), поэтому мне пришлось делать :

  String[] cmdline = { "sh", "-c", "source /sdcard/copy-r /sdcard/files4 /data/data/com.example.myapp/files" }; try { Runtime.getRuntime().exec(cmdline); } catch (IOException e) { e.printStackTrace(); } 

В приложении onCreate () .

PS на случай, если кому-то понадобится код для снятия защиты с каталогов приложений, чтобы разрешить доступ к adb shell на некорневом телефоне,

  setRW(appContext.getFilesDir().getParentFile()); public static void setRW(File... files) { for (File file : files) { if (file.isDirectory()) { setRW(file.listFiles()); // Calls same method again. } else { } file.setReadable(true, false); file.setWritable(true, false); } } 

Хотя по какой-то неизвестной причине я мог читать, но не писать.

Если у вас есть root-доступ, установите busybox ( инструкции для Google ).

Я мог бы предложить просто установить Terminal-ide на ваше устройство, доступное на игровом рынке . Он бесплатный, не требует root и обеспечивает удобную среду * nix, такую ​​как cp, find, du, mc и многие другие утилиты, которые устанавливаются в двоичной форме одним нажатием кнопки.