Как скопировать и отредактировать файлы в оболочке Android?
В оболочке Android нет команды cp. В оболочке Android также нет sed или grep или vi. У меня нет демона adb. Существует команда mv, но она отказывается работать, если источник находится в устройстве только для чтения.
- Что делать, если мне нужно скопировать некоторые каталоги из устройства только для чтения?
- Как изменить строку в текстовом файле (например, "PATH =/cache" на "PATH =/mnt/asec" )?
Ответы
Ответ 1
Самый распространенный ответ на этот вопрос прост: связать несколько приложений (busybox?) с APK (при условии, что вы хотите использовать его в приложении). Насколько мне известно, раздел /data не монтируется noexec, и даже если вы не хотите развертывать полноценный APK, вы можете изменить источники ConnectBot для создания APK с помощью набора инструментов командной строки.
Для инструментов командной строки я рекомендую использовать crosstool-ng и создать набор статически связанных инструментов (связанных с uClibc). Они могут быть большими, но они определенно будут работать.
Ответ 2
Чтобы скопировать dirs, кажется, вы можете использовать adb pull <remote> <local>
, если вы хотите скопировать файл /dir с устройства и adb push <local> <remote>
, чтобы скопировать файл/директорию на устройство. Кроме того, чтобы скопировать файл, вы можете использовать простой трюк: cat source_file > dest_file
. Обратите внимание, что это не работает для недоступных пользователем путей.
Чтобы редактировать файлы, я не нашел простого решения, просто некоторые возможные обходные пути. Попробуйте this, кажется, что вы можете (после установки) использовать его для редактирования таких файлов, как busybox vi <filename>
. Нано, похоже, можно использовать.
Ответ 3
Вы можете сделать это без прав root:
cat srcfile > /mnt/sdcard/dstfile
Ответ 4
Вы можете использовать cat > filename
для использования стандартного ввода для записи в файл. В конце вы должны поставить EOF CTRL+D
.
Ответ 5
Также, если целью является только доступ к файлам на телефоне. Существует проводник файлов, доступный с точки зрения Eclipse DDMS. Он позволяет копировать файл с устройства и на него. Поэтому вы всегда можете получить файл, изменить его и вернуть обратно на устройство. Конечно, он позволяет получить доступ только к файлам, которые не защищены от записи.
Если вы не видите File Explorer, с точки зрения DDMS, зайдите в "Окно" → "Показать вид" → "Проводник".
Ответ 6
Так как политика разрешений на моем устройстве немного параноидальная (не может adb pull
данные приложения), я написал script для рекурсивного копирования файлов.
Примечание: эта рекурсивная копия файла/папки script предназначена для 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);
}
}
хотя по какой-то неизвестной причине я мог читать, но не писать.
Ответ 7
Если у вас есть root-доступ, установите busybox (Google для инструкций).
Ответ 8
Я мог бы предложить просто установить Terminal-ide на ваше устройство, доступное на игровом рынке. Он бесплатный, не требует root и обеспечивает удобную среду * nix, такую как cp, find, du, mc и многие другие утилиты, которые устанавливаются в двоичной форме одним нажатием кнопки.
Ответ 9
Android поддерживает команду dd.
dd if=/path/file of=/path/file
Ответ 10
Я попытался следовать на Mac.
- Запустите Terminal и перейдите в папку, где находится adb. На Mac обычно в
/Library/Android/sdk/platform-tools
. - Подключите устройство сейчас с
./adb status
режимом разработчика и проверьте состояние устройства с помощью команды ./adb status
. "./"
должен начинаться с префикса "adb". - Теперь нам может понадобиться узнать местоположение папки назначения на нашем устройстве. Вы можете проверить это с помощью
adb shell
. Используйте команду ./adb shell
для входа в оболочку adb. Теперь у нас есть доступ к папке устройства с помощью оболочки. - Вы можете перечислить все папки, используя команду
ls -la
. - Обычно мы находим папку
/sdcard
на нашем устройстве. (Вы можете выбрать любую папку здесь.) Предположим, мой пункт назначения - /sdcard/3233-3453/DCIM/Videos
а источник - ~/Documents/Videos/film.mp4
- Теперь мы можем выйти из оболочки adb для доступа к файловой системе на нашей машине. Команда:
./adb exit
- Сейчас
./adb push [source location] [destination location]
т.е. ./adb push ~/Documents/Videos/film.mp4/sdcard/3233-3453/DCIM/Videos
- Вуаля.
Ответ 11
Если вы просто хотите добавить файл, например, добавить несколько строк в файл конфигурации, достаточно встроенных команд оболочки:
adb shell
cat >> /path/to/file <<EOF
some text to append
a second line of text to append
EOF
exit
Выше замените /path/to/file
файлом, который вы хотите отредактировать. Вам нужно иметь разрешение на запись в файл, что подразумевает доступ с правами root, если вы редактируете системный файл. Во-вторых, замените some text to append
и a second line of text to append
строки, которые вы хотите добавить.