2011-01-17 1 views
61

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

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

Предоставлено ли какое-либо из предлагаемых решений? – gnclmorais

+0

@MEGA: как я уже сказал, adb не установлен. Я могу скопировать с помощью команды «cat src> dst», но я не знаю, как сделать это рекурсивно? – psihodelia

+0

Я не понимаю. Чтобы получить доступ к оболочке, вы вводите './adb shell'. Если вы говорите, что у вас нет доступных «adb», как вы можете получить доступ к оболочке? – gnclmorais

ответ

16

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

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

2

Если у вас есть корневой доступ, установите busybox (google for instructions).

+0

Спасибо! И для тех, кто споткнулся об этом сейчас, теперь есть возможность установки без полномочий root, которая дала мне grep и т. Д. В экстренной ситуации только с моим планшетом :) – herdingofthecats

+0

busybox уже существует на моем одном плюс 3t, его называемый «ящик» по какой-либо причине , – Amias

86

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

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

+14

К сожалению, 'adb pull' /' adb push' не будет работать с недоступными для пользователя способами. – ulidtko

+2

Только что помог мне восстановить более 500 фотографий и видео с недоступного раздела SD-карты.Спасибо :) – Phantomwhale

+0

Этот двоичный файл не работает на последних телефонах –

4

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

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

+0

работает только на эмуляторе – user1324936

28

Вы можете сделать это без корневых разрешений:

cat srcfile > /sdcard/dstfile 
+0

работает ли он и на двоичные файлы? или он просто работает для файлов TEXT? – VSB

+4

Да, он также работает с двоичными файлами – Viriatvs

+0

Я думаю, что лучше обновить путь к SDD-карте/mnt/sdcard/... – VSB

9

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

3

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

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

копия-р:

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

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

0

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