Como la política de permisos en mi dispositivo es un poco paranoica (no puedo datos de la aplicación adb pull
), escribí una secuencia de comandos para copiar archivos recursivamente.
Nota: este script recursivo de copia de archivo/carpeta está destinado para Android.
copia-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
Aquí me proporcionan la fuente de una ligera find
para Android, porque en algunos dispositivos de esta utilidad dónde están. En lugar de myfind
se puede usar find
, si está definido en el dispositivo.
Instalación:
$ adb push copy-r /sdcard/
Ejecución en adb shell
(arraigado):
# . /sdcard/copy-r files/ /sdcard/files3
o
# source /sdcard/copy-r files/ /sdcard/files3
(El hash #
anterior es la su
rápida, mientras que .
es el comando que hace que el shell ejecute el archivo especificado, casi el mismo que source
).
Después de copiar, puedo adb pull
los archivos de la tarjeta SD.
Escribir archivos en el directorio de la aplicación fue más complicado, traté de establecer permisos r/w en files
y sus subdirectorios, no funcionó (bueno, me permitió leer, pero no escribir, lo cual es extraño), por lo que tenía que hacer:
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();
}
en la aplicación de onCreate().
PS si acaso alguien necesita el código para desproteger los directorios de aplicación para permitir el acceso adb shell
en un teléfono que no sea arraigado,
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);
}
}
aunque por alguna razón desconocida que podía leer pero no escribir.
¿Alguna de las soluciones proporcionadas le funcionó? – gnclmorais
@MEGA: como dije, no hay ningún adb instalado. Puedo copiar utilizando el comando "cat src> dst", pero no sé cómo hacerlo de forma recursiva. – psihodelia
No lo entiendo Para acceder al shell, escribe './adb shell'. Si está diciendo que no tiene 'adb' disponible, ¿cómo puede acceder al shell? – gnclmorais