由于我设备上的权限策略有点偏执(不能adb pull应用数据),我写了一个脚本来递归复制文件。
注意:此递归文件/文件夹复制脚本适用于 Android!
复制-r:
#! /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
这里我提供了一个用于 Android 的轻量级 find 的源代码,因为在某些设备上缺少此实用程序。如果在设备上定义了find,则可以使用find,而不是myfind。
安装:
$ adb push copy-r /sdcard/
在adb shell (root) 内运行:
# . /sdcard/copy-r files/ /sdcard/files3
或
# source /sdcard/copy-r files/ /sdcard/files3
(上面的哈希#是su提示符,而.是导致shell运行指定文件的命令,几乎和source一样)。
复制后,我可以adb pull sd卡中的文件。
将文件写入 app 目录比较棘手,我尝试在 files 及其子目录上设置 r/w 权限,但没有成功(嗯,它允许我读取,但不能写入,这很奇怪),所以我不得不这样做:
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 以防万一有人需要代码来取消保护应用程序的目录以在非 root 手机上启用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);
}
}
虽然不知什么原因我能读但不能写。