Как копировать и редактировать файлы в оболочке Android? - PullRequest
64 голосов
/ 17 января 2011

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

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

Ответы [ 10 ]

90 голосов
/ 01 февраля 2011

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

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

31 голосов
/ 15 марта 2012

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

cat srcfile > /mnt/sdcard/dstfile
16 голосов
/ 31 января 2011

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

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

9 голосов
/ 30 июля 2013

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

4 голосов
/ 02 февраля 2011

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

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

3 голосов
/ 11 февраля 2015

Поскольку политика разрешений на моем устройстве немного параноидальна (не может 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 (root):

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

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

2 голосов
/ 18 января 2011

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

1 голос
/ 10 марта 2019

Android поддерживает команду dd.

dd if=/path/file of=/path/file
1 голос
/ 27 декабря 2015

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

0 голосов
/ 28 октября 2018

Я попытался выполнить следующие действия на Mac.

  1. Запустить терминал и перейти в папку, где находится adb.На Mac обычно /Library/Android/sdk/platform-tools.
  2. Подключите устройство сейчас, когда включен режим разработчика, и проверьте состояние устройства с помощью команды ./adb status."./" должен начинаться с префикса "adb".
  3. Теперь нам может понадобиться узнать местоположение папки назначения на нашем устройстве.Вы можете проверить это с помощью adb shell.Используйте команду ./adb shell для входа в оболочку adb.Теперь у нас есть доступ к папке устройства с помощью оболочки.
  4. Вы можете перечислить все папки с помощью команды ls -la.
  5. Обычно мы находим папку /sdcard на нашем устройстве. (Вы можете выбратьлюбая папка здесь.) Предположим, мой пункт назначения /sdcard/3233-3453/DCIM/Videos и источник ~/Documents/Videos/film.mp4
  6. Теперь мы можем выйти из оболочки adb для доступа к файловой системе на нашей машине.Команда: ./adb exit
  7. Сейчас ./adb push [source location] [destination location]
    т.е. ./adb push ~/Documents/Videos/film.mp4 /sdcard/3233-3453/DCIM/Videos
  8. Вуаля.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...