web-dev-qa-db-ja.com

Androidシェルでファイルをコピーおよび編集する方法

Androidシェルにはcpコマンドがありません。 Androidシェルにもsedまたはgrepまたはviはありません。 adbデーモンが利用できません。 mvコマンドがありますが、ソースが読み取り専用デバイスにある場合は動作を拒否します。

  1. 読み取り専用デバイスからいくつかのディレクトリを再帰的にコピーする必要がある場合はどうすればよいですか?
  2. テキストファイルの行を変更する方法(例:「PATH =/cache」を「PATH =/mnt/asec」にする)
65
psihodelia

最も一般的な答えは簡単です。APKにいくつかのアプリ(busybox?)をバンドルします(アプリケーション内で使用したい場合)。私の知る限り、/ dataパーティションはnoexecでマウントされていません。完全なAPKをデプロイしたくない場合でも、ConnectBotソースを変更して、一連のコマンドラインツールを含むAPKを構築できます。

コマンドラインツールの場合は、crosstool-ngを使用して、静的にリンクされたツールのセット(uClibcにリンク)を構築することをお勧めします。彼らは大きいかもしれませんが、彼らは間違いなく動作します。

16
p_l

ディレクトリをコピーするには、デバイスからファイル/ディレクトリをコピーする場合はadb pull <remote> <local>を、デバイスにファイル/ディレクトリをコピーするにはadb Push <local> <remote>を使用できるようです。または、ファイルをコピーするために、単純なトリックcat source_file > dest_fileを使用できます。これは、ユーザーがアクセスできないパスでは機能しないことに注意してください。

ファイルを編集するための簡単な解決策はなく、可能な回避策をいくつか見つけました。 this を試してください。(セットアップ後)busybox vi <filename>などのファイルを編集するために使用できるようです。 Nanoは 使用可能 のようです。

90
gnclmorais

ルート権限なしでそれを行うことができます:

cat srcfile > /mnt/sdcard/dstfile
31
Viriatvs

cat > filenameを使用して、標準入力を使用してファイルに書き込むことができます。最後にEOF CTRL+Dを配置する必要があります。

9
kubo

また、目的が電話のファイルにのみアクセスすることである場合。 Eclipse DDMSパースペクティブからアクセス可能なファイルエクスプローラーがあります。デバイスとの間でファイルをコピーできます。そのため、いつでもファイルを取得して変更し、デバイスに戻すことができます。もちろん、読み取り保護されていないファイルにのみアクセスできます。

ファイルエクスプローラーが表示されない場合は、DDMSの観点から、[ウィンドウ]-> [ビューの表示]-> [ファイルエクスプローラー]に移動します。

4
jmbouffard

デバイスのアクセス許可ポリシーは少し偏執的であるため(adb pullアプリケーションデータは許可されません)、ファイルを再帰的にコピーするスクリプトを作成しました。

注:この再帰的なファイル/フォルダーコピースクリプトは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

一部のデバイスではこのユーティリティが欠落しているため、ここでは、Androidの軽量findのソースを提供します。デバイスで定義されている場合、myfindの代わりにfindを使用できます。

インストール:

$ adb Push copy-r /sdcard/

adb Shell(ルート化)内で実行:

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

または

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

(上記のハッシュ#suプロンプトですが、.sourceとほぼ同じように、シェルに指定されたファイルを実行させるコマンドです)。

コピー後、SDカードからファイルをadb pullできます。

アプリディレクトリへのファイルの書き込みは複雑で、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は、ルート化されていない電話で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);
        }
    }

何らかの不明な理由で、私は読むことはできましたが、書くことはできませんでした。

ルートアクセスインストールbusyboxがある場合( 手順についてはgoogle )。

2

Androidはddコマンドをサポートしています。

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

Terminal-ide を利用可能なデバイスにインストールすることをお勧めします play market 。その無料のルートは不要で、cp、find、du、mcなどの便利な* nix環境と、ボタンを1回タップするだけでバイナリ形式でインストールされる他の多くのユーティリティを提供します。

1
Hubbitus

Macでフォローしようとしました。

  1. ターミナルを起動し、adbがあるフォルダーに移動します。 Macでは、通常/Library/Android/sdk/platform-toolsにあります。
  2. 開発者モードをオンにしてデバイスを接続し、コマンド./adb statusを使用してデバイスのステータスを確認します。 "./"の先頭には「adb」が付きます。
  3. ここで、デバイス内の宛先フォルダーの場所を知る必要があります。これはadb Shellで確認できます。コマンド./adb Shellを使用して、adbシェルに入ります。これで、シェルを使用してデバイスのフォルダーにアクセスできます。
  4. コマンドls -laを使用して、すべてのフォルダーを一覧表示できます。
  5. 通常、デバイス内にフォルダー/sdcardがあります(ここで任意のフォルダーを選択できます)。宛先が/sdcard/3233-3453/DCIM/Videos、ソースが~/Documents/Videos/film.mp4であるとします
  6. これで、adbシェルを終了して、マシン上のファイルシステムにアクセスできます。コマンド:./adb exit
  7. ./adb Push [source location] [destination location]
    i.e ./adb Push ~/Documents/Videos/film.mp4 /sdcard/3233-3453/DCIM/Videos
  8. 出来上がり。
0
Jose

ファイルに追加したいだけなら、例えば構成ファイルにいくつかの行を追加するには、組み込みのシェルコマンドで十分です。

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

上記で、/path/to/fileを編集するファイルに置き換えます。ファイルへの書き込み許可が必要です。これは、システムファイルを編集している場合はルートアクセスを意味します。次に、some text to appenda second line of text to appendを追加する行に置き換えます。

0
bleater