Поскольку политика разрешений на моем устройстве несколько параноидальная (не может 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);
}
}
хотя по неизвестной причине я мог читать, но не писать.
Предоставлено ли какое-либо из предлагаемых решений? – gnclmorais
@MEGA: как я уже сказал, adb не установлен. Я могу скопировать с помощью команды «cat src> dst», но я не знаю, как сделать это рекурсивно? – psihodelia
Я не понимаю. Чтобы получить доступ к оболочке, вы вводите './adb shell'. Если вы говорите, что у вас нет доступных «adb», как вы можете получить доступ к оболочке? – gnclmorais