web-dev-qa-db-fra.com

Comment copier et éditer des fichiers dans un shell Android?

Android Shell n'a pas la commande cp . Android Shell n'a pas non plus sed ou grep ou vi . Je n'ai pas de adb daemon disponible. Il y a mv command mais il refuse de fonctionner si la source est sur un périphérique en lecture seule. 

  1. Que faire si je dois copier certains répertoires à partir d'un périphérique en lecture seule de manière récursive? 
  2. Comment modifier une ligne dans un fichier texte (par exemple, "PATH =/cache" est "PATH =/mnt/asec")?
63
psihodelia

La réponse la plus courante à cette question est simple: associez quelques applications (busybox?) À votre APK (en supposant que vous souhaitiez l’utiliser dans une application). Pour autant que je sache, la partition/data n'est pas montée noexec, et même si vous ne souhaitez pas déployer un fichier APK à part entière, vous pouvez modifier les sources ConnectBot pour créer un fichier APK avec un ensemble d'outils en ligne de commande.

Pour les outils de ligne de commande, je recommande d'utiliser crosstool-ng et de créer un ensemble d'outils liés de manière statique (liés à uClibc). Ils peuvent être gros, mais ils vont certainement travailler.

16
p_l

Pour copier des répertoires, il semble que vous pouvez utiliser adb pull <remote> <local> si vous souhaitez copier un fichier/répertoire depuis un périphérique, et adb Push <local> <remote> pour copier un fichier/répertoire vers un périphérique. Alternativement, pour copier un fichier, vous pouvez utiliser une astuce simple: cat source_file > dest_file. Notez que cela ne fonctionne pas pour les chemins inaccessibles par l'utilisateur.

Pour éditer des fichiers, je n'ai pas trouvé de solution simple, mais quelques solutions de contournement possibles. Essayez this , il semble que vous puissiez (après l’installation) l’utiliser pour éditer des fichiers tels que busybox vi <filename>. Nano semble être possible d'utiliser aussi.

89
gnclmorais

Vous pouvez le faire sans autorisations root:

cat srcfile > /mnt/sdcard/dstfile
31
Viriatvs

Vous pouvez utiliser cat > filename pour utiliser une entrée standard pour écrire dans le fichier. À la fin, vous devez mettre EOF CTRL+D.

9
kubo

Aussi, si l'objectif est uniquement d'accéder aux fichiers du téléphone. Il existe un explorateur de fichiers accessible depuis la perspective DDMS d'Eclipse. Il vous permet de copier un fichier depuis et vers le périphérique. Ainsi, vous pouvez toujours obtenir le fichier, le modifier et le remettre sur l'appareil. Bien sûr, cela permet d’accéder uniquement aux fichiers qui ne sont pas protégés en lecture.

Si vous ne voyez pas l'explorateur de fichiers, dans la perspective DDMS, allez dans "Fenêtre" -> "Afficher la vue" -> "Explorateur de fichiers".

4
jmbouffard

Étant donné que la stratégie d’autorisation sur mon appareil est un peu paranoïaque (je ne peux pas utiliser les données de l’application adb pull), j’ai écrit un script pour copier les fichiers de manière récursive.

Remarque: ce script de copie récursif de fichiers/dossiers est destiné à Android!

copie-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

Ici, je fournis la source d'une find légère pour Android car cet utilitaire est manquant sur certains appareils. Au lieu de myfind, vous pouvez utiliser find, s'il est défini sur le périphérique.

Installation:

$ adb Push copy-r /sdcard/

En cours d'exécution dans adb Shell (enraciné):

# . /sdcard/copy-r files/ /sdcard/files3 

ou

# source /sdcard/copy-r files/ /sdcard/files3 

(Le hash # ci-dessus est l'invite su, alors que . est la commande qui force le shell à exécuter le fichier spécifié, presque identique à source).

Après avoir copié, je peux adb pull les fichiers de la carte SD.

Écrire des fichiers dans le répertoire de l'application était plus compliqué. J'ai essayé de définir des autorisations r/w sur files et ses sous-répertoires. :

        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();
        }

dans l'application onCreate () .

PS juste au cas où quelqu'un aurait besoin du code pour déprotéger les répertoires de l'application afin de permettre l'accès adb Shell sur un téléphone non root, 

        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);
        }
    }

bien que pour une raison inconnue, je sois capable de lire mais pas d’écrire.

3
18446744073709551615

Si vous avez un accès root, utilisez busybox ( google pour les instructions ).

2
Diego Torres Milano

Android prend en charge la commande dd.

dd if=/path/file of=/path/file
1
jrc

Je pourrais suggérer simplement d’installer Terminal-ide sur votre appareil disponible sur le marché du jeu . Il est gratuit, ne nécessite pas de racine et fournit un environnement pratique * nix comme cp, find, du, mc et de nombreux autres utilitaires installés sous une forme binaire par un clic de souris.

1
Hubbitus

Si vous souhaitez simplement ajouter un fichier à un fichier, par exemple pour ajouter des lignes à un fichier de configuration, les commandes Shell intégrées suffisent:

adb Shell
cat >> /path/to/file <<EOF
some text to append
a second line of text to append
EOF
exit

Dans ce qui précède, remplacez /path/to/file par le fichier que vous souhaitez modifier. Vous aurez besoin d'une autorisation en écriture sur le fichier, ce qui implique un accès root si vous modifiez un fichier système. Deuxièmement, remplacez some text to append et a second line of text to append par les lignes à ajouter.

0
bleater