Cómo copiar y editar archivos en Android shell?
El shell de Android no tiene el comando cp. Android shell también no tiene sed o grep o vi. No tengo ningún demonio adb disponible. Existe el comando mv pero rechaza trabajar si source está en un dispositivo de solo lectura.
- ¿Qué hacer si tengo que copiar algunos directorios de un dispositivo de solo lectura recursivamente?
- ¿Cómo cambiar una línea en un archivo de texto (por ejemplo, "PATH=/cache" para que sea "PATH=/mnt/asec") ?
8 answers
La respuesta más común a eso es simple: Paquete de pocas aplicaciones (busybox?) con tu APK (suponiendo que quieras usarlo dentro de una aplicación). Por lo que sé, la partición /data no está montada en noexec, e incluso si no desea implementar un APK en toda regla, podría modificar las fuentes de ConnectBot para construir un APK con un conjunto de herramientas de línea de comandos incluidas.
Para las herramientas de línea de comandos, recomiendo usar crosstool-ng y construir un conjunto de herramientas enlazadas estáticamente (enlazadas contra uClibc). Le puede ser grande, pero definitivamente funcionarán.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-31 02:21:20
Para copiar dirs, parece que puede usar adb pull <remote> <local>
si desea copiar archivo/dir desde el dispositivo, y adb push <local> <remote>
para copiar archivo/dir al dispositivo. Alternativamente, solo para copiar un archivo, puede usar un truco simple: cat source_file > dest_file
. Tenga en cuenta que esto no funciona para rutas inaccesibles para el usuario.
Para editar archivos, no he encontrado una solución simple, solo algunas posibles soluciones. Pruebe este, parece que puede (después de la configuración) usarlo para editar archivos como busybox vi <filename>
. Nano parece ser posible usar también.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-26 15:08:30
Puedes hacerlo sin permisos de root:
cat srcfile > /mnt/sdcard/dstfile
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 16:08:20
Puede usar cat > filename
para usar la entrada estándar para escribir en el archivo. Al final hay que poner EOF CTRL+D
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-30 10:52:56
También si el objetivo es solo acceder a los archivos en el teléfono. Hay un Explorador de archivos al que se puede acceder desde la perspectiva de Eclipse DDMS. Le permite copiar el archivo desde y hacia el dispositivo. Así que siempre puede obtener el archivo, modificarlo y volver a ponerlo en el dispositivo. Por supuesto, permite acceder solo a los archivos que no están protegidos de lectura.
Si no ve el Explorador de archivos, desde la perspectiva DDMS, vaya a "Ventana" -> "Mostrar vista" -> "Explorador de archivos".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 21:05:55
Dado que la política de permisos en mi dispositivo es un poco paranoica (no se pueden adb pull
los datos de la aplicación), escribí un script para copiar archivos recursivamente.
Nota: este script de copia de archivo/carpeta recursiva está destinado a Android!
copy-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í proporciono la fuente de un ligero find
para Android porque en algunos dispositivos esta utilidad falta. En lugar de myfind
se puede usar find
, si se define en el dispositivo.
Instalación:
$ adb push copy-r /sdcard/
Corriendo dentro de adb shell
(rooteado):
# . /sdcard/copy-r files/ /sdcard/files3
O
# source /sdcard/copy-r files/ /sdcard/files3
(El hash #
anterior es el prompt su
, mientras que .
es el comando que hace que el shell ejecute el archivo especificado, casi lo 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 era más complicado, traté de establecer permisos r / w en files
y sus subdirectorios, no funcionó (bien, me permitió leer, pero no escribir, lo cual es extraño), así que tuve 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 onCreate().
PS en caso de que alguien necesite el código para desproteger los directorios de la aplicación para habilitar adb shell
el acceso en un teléfono no rooteado,
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, podía leer pero no escribir.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 14:00:18
Si tiene acceso root, instale busybox ( google para obtener instrucciones).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-18 03:43:16
Podría sugerir simplemente instalar Terminal-ide en su dispositivo que está disponible en play market. Es gratis, no requiere root y proporciona un entorno conveniente *nix como cp, find, du, mc y muchas otras utilidades que se instalan en forma binaria con un toque de botón.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-27 19:15:04