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



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




  1. Что делать, если мне нужно скопировать некоторые каталоги из устройства только для чтения рекурсивно?

  2. как изменить строку в текстовом файле (например, " PATH= / cache" быть "PATH=/mnt / asec") ?

758   8  

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>. Нано-видимому, можно использовать тоже.

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

cat srcfile > /mnt/sdcard/dstfile

можно использовать cat > filename использовать стандартный ввод для записи в файл. В конце вы должны поставить EOF CTRL+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

    Ничего не найдено.