Как копировать и редактировать файлы в оболочке Android?
оболочка Android не имеет cp. Android shell также не имеет sed или grep или vi. У меня нет adb демон доступен. Есть mv но он отказывается работать, если источник находится на устройстве только для чтения.
- Что делать, если мне нужно скопировать некоторые каталоги из устройства только для чтения рекурсивно?
- как изменить строку в текстовом файле (например, " PATH= / cache" быть "PATH=/mnt / asec") ?
8 ответов:
наиболее распространенный ответ на это прост: Bundle few apps (busybox?) с АПК (если вы хотите использовать его в приложении). Насколько я знаю, раздел /data не монтируется noexec, и даже если вы не хотите развертывать полноценный APK, вы можете изменить источники ConnectBot для создания APK с набором инструментов командной строки.
для инструментов командной строки я рекомендую использовать crosstool-ng и построить набор статически связанных инструментов (связанных против uClibc). Они могут быть большими, но они точно работают.
чтобы скопировать dirs, кажется, вы можете использовать
adb pull <remote> <local>Если вы хотите скопировать файл / dir с устройства, иadb push <local> <remote>для копирования файла / dir на устройство. Кроме того, просто скопировать файл, вы можете использовать простой трюк:cat source_file > dest_file. Обратите внимание, что это не работает для недоступных пользователю путей.для редактирования файлов я не нашел простого решения, просто некоторые возможные обходные пути. Попробуй этой, кажется, можно (после установки) использовать его для редактирования файлов, таких как
busybox vi <filename>. Нано-видимому, можно использовать тоже.
можно использовать
cat > filenameиспользовать стандартный ввод для записи в файл. В конце вы должны поставить EOFCTRL+D.
также, если целью является только доступ к файлам на телефоне. Существует проводник файлов, который доступен с точки зрения Eclipse DDMS. Он позволяет копировать файл с устройства и на него. Таким образом, вы всегда можете получить файл, изменить его и вернуть на устройство. Конечно, это позволяет получить доступ только к файлам, которые не защищены от чтения.
Если вы не видите проводник, с точки зрения DDMS, перейдите в "окно" -> "показать вид" -> "проводник".
так как политика разрешений на моем устройстве немного параноидальная (не может
adb pullданные приложения), я написал скрипт для рекурсивного копирования файлов.Примечание: этот рекурсивный скрипт копирования файлов/папок предназначен для Android!
копировать-r:
#! /system/bin/sh src="" dst="" dir0=`pwd` myfind() { local fpath= 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 на вас устройство, которое доступно в play market. Его бесплатно, не требует root и обеспечивает удобную среду *nix, такую как cp, find, du, mc и многие другие утилиты, которые установлены в двоичной форме одним нажатием кнопки.
Comments