2011-01-17 10 views
61

Androidシェルにcpコマンドがありません。 Androidシェルには、sedまたはgrepまたはviもありません。私にはadbデーモンがありません。 mvコマンドがありますが、ソースが読み取り専用デバイスにある場合は動作しません。私は再帰的に読み取り専用デバイスからいくつかのディレクトリをコピーする必要がある場合に何をすべきかAndroidシェルでファイルをコピーして編集する方法は?

  1. テキストファイルの行を変更するには(たとえば、「PATH =/cache」を「PATH =/mnt/asec」に変更しますか?
+0

提供されているソリューションはどれですか? – gnclmorais

+0

@MEGA:私が言ったように、adbはインストールされていません。私は "cat src> dst"コマンドを使ってコピーできますが、再帰的にする方法はわかりません。 – psihodelia

+0

私はそれを取得しません。シェルにアクセスするには、 './adb shell'と入力します。あなたが 'adb'を利用できないと言っているなら、どのようにシェルにアクセスできますか? – gnclmorais

答えて

16

最も一般的な答えは簡単です:APKにいくつかのアプリケーション(ビジーボックス?)をバンドルします(アプリケーション内で使用することを前提としています)。私の知る限り、/ dataパーティションはnoexecにはマウントされていません。また、本格的なAPKを展開したくない場合でも、ConnectBotのソースを変更してコマンドラインツールを組み込んだAPKを構築できます。

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

2

ルートアクセス権を持っている場合は、ビジーボックス(google for instructions)をインストールします。

+0

ありがとう!誰もが今この問題を抱えている人には、root権限を持たないインストーラがあり、私のタブレットのみでgrepなどを緊急時に提供しています:) – herdingofthecats

+0

busyboxは何らかの理由で私の1 + 3t、 。 – Amias

86

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

ファイルを編集するには、単純な解決策が見つからず、回避策がいくつかあります。 thisを試してみてください。セットアップ後にbusybox vi <filename>のようなファイルを編集することができます。ナノもpossible to useと思われる。

+14

残念ながら、 'adb pull' /' adb push'はユーザがアクセスできないパスでは動作しません。 – ulidtko

+2

アクセスできないSDカードパーティションから500以上の写真やビデオを復元するのに役立ちました。ありがとう:) – Phantomwhale

+0

そのバイナリは最新の電話では動作しません –

4

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

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

+0

はエミュレータでのみ動作します – user1324936

28

あなたはroot権限なしでそれを行うことができます:あなたは、ファイルへの書き込みにスタンダール入力を使用するようにcat > filenameを使用することができます

cat srcfile > /sdcard/dstfile 
+0

バイナリファイルでも動作しますか?それともTEXTファイルのためだけに機能しますか? – VSB

+4

はい、バイナリファイルでも動作します – Viriatvs

+0

/mnt/sdcard /にSDカードパスを更新する方が良いと思います... – VSB

9

。最後にEOF CTRL+Dを入れなければなりません。

3

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

注:この再帰的なファイル/フォルダのコピースクリプトは、Android用です!

コピー-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 shell内で実行

$ adb push copy-r /sdcard/ 

(根ざし):.コマンドである

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

又は

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

(上記ハッシュ#は、プロンプトsuありますシェルを実行させる指定されたファイルは、sourceとほとんど同じです)。

コピーした後、私はadb pullのファイルをsdカードから取得できます。

ファイルをアプリディレクトリに書き込むのが厄介で、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は、念のために誰かが、私は読み書きが、できなかったいくつかの未知の理由が

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

、非根ざし電話でadb shellのアクセスを可能にするために、アプリケーションのディレクトリの保護を解除するためのコードを必要とします。

0

をご使用のデバイスにインストールすることをお勧めします。in play marketその無料では、ルートを必要とせず、cp、find、du、mcなどの便利な* nix環境を1つのボタンタップでバイナリ形式でインストールしたユーティリティを提供します。

関連する問題