2011-01-17 59 views
61

El shell de Android no tiene el comando cp. Android shell tampoco tiene sed o grep o vi. No tengo adb daemon disponible. Existe el comando mv, pero se rechaza si la fuente está en un dispositivo de solo lectura.Cómo copiar y editar archivos en el shell de Android?

  1. ¿Qué hacer si tengo que copiar algunos directorios desde el dispositivo de solo lectura recursivamente?
  2. Cómo cambiar una línea en un archivo de texto (por ejemplo, "RUTA =/memoria caché" para que sea "RUTA =/mnt/asec")?
+0

¿Alguna de las soluciones proporcionadas le funcionó? – gnclmorais

+0

@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

+0

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

Respuesta

16

La respuesta más común es simple: ¿Se incluyen algunas aplicaciones (busybox?) Con su APK (suponiendo que desea usarlo dentro de una aplicación). Por lo que yo sé, la partición/data no está montada noexec, e incluso si no desea implementar una APK completamente desarrollada, puede modificar las fuentes de ConnectBot para construir una 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 (vinculadas con uClibc). Podrían ser grandes, pero definitivamente funcionarán.

2

Si tiene acceso de root, instale busybox (google for instructions).

+0

¡Gracias! Y para cualquiera que se tropiece con esto ahora, ahora hay un instalador no root disponible, que me dio grep, etc. en una emergencia con solo mi tableta :) – herdingofthecats

+0

busybox ya está allí en mi uno más 3t, se llama 'caja' por alguna razón . – Amias

86

Para copiar directorios, parece que puede usar adb pull <remote> <local> si desea copiar el archivo/dir del dispositivo, y para copiar el 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 las rutas inaccesibles por el usuario.

Para editar archivos, no he encontrado una solución simple, solo algunas posibles soluciones. Pruebe this, parece que puede (después de la configuración) usarlo para editar archivos como busybox vi <filename>. Nano parece ser possible to use también.

+14

Desafortunadamente, 'adb pull' /' adb push' no funcionará con rutas inaccesibles por el usuario. – ulidtko

+2

Me ayudó a recuperar más de 500 fotos y videos de una partición de tarjeta SD inaccesible.Gracias :) – Phantomwhale

+0

Ese binario no funciona en los últimos teléfonos –

4

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 archivos desde y hacia el dispositivo. Por lo tanto, siempre puede obtener el archivo, modificarlo y volver a colocarlo en el dispositivo. Por supuesto, permite acceder solo a los archivos que no están protegidos para lectura.

Si no ve el Explorador de archivos, desde la perspectiva DDMS, vaya a "Ventana" -> "Mostrar vista" -> "Explorador de archivos".

+0

funciona solo en el emulador – user1324936

28

Puede hacerlo sin permisos de root:

cat srcfile > /sdcard/dstfile 
+0

¿Funciona también para archivos binarios? o simplemente funciona para archivos TEXT? – VSB

+4

sí, también funciona con archivos binarios – Viriatvs

+0

Creo que es mejor actualizar la ruta de la tarjeta sd a/mnt/sdcard/... – VSB

9

Puede utilizar cat > filename utilizar la entrada standart escribir en el archivo. Al final tienes que poner EOF CTRL+D.

3

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.

0

Podría sugerir simplemente instalar Terminal-ide en su dispositivo, que está disponible in play market. Es gratis, no requiere root y proporciona un conveniente entorno * nix como cp, find, du, mc y muchas otras utilidades que se instalan en forma binaria con un solo toque.

Cuestiones relacionadas