2011-01-17 3 views
61

Android 쉘에 cp 명령이 없습니다. Android 셸에는 sed 또는 grep 또는 vi도 없습니다. 나는 adb 데몬을 사용할 수 없습니다. mv 명령이 있지만 읽기 전용 장치에 원본이 있으면 작동하지 않습니다.Android 셸에서 파일을 복사하고 편집하는 방법은 무엇입니까?

  1. 일부 디렉토리를 읽기 전용 장치에서 재귀 적으로 복사해야하는 경우 어떻게해야합니까?
  2. 텍스트 파일에서 줄을 바꾸는 방법 (예 : "PATH =/cache"를 "PATH =/mnt/asec"으로 변경)?
+0

제공된 솔루션 중 어떤 것이 효과가 있습니까? – gnclmorais

+0

@MEGA : 내가 말했듯이, adb가 설치되어 있지 않습니다. "cat src> dst"명령을 사용하여 복사 할 수 있지만 재귀 적으로 만드는 방법을 모릅니다. – psihodelia

+0

나는 그것을 얻지 않는다. 쉘에 액세스하려면'./adb shell'을 입력하십시오. 'adb ​​'를 사용할 수 없다는 말을 들으면 쉘에 어떻게 접근 할 수 있습니까? – gnclmorais

답변

16

가장 일반적인 대답은 간단합니다. APK에 몇 가지 응용 프로그램 (busybox?)을 번들로 묶습니다 (응용 프로그램 내에서 사용하려는 경우). 내가 아는 한/data 파티션은 noexec에 마운트되지 않으며 본격적인 APK를 배포하지 않으려는 경우에도 명령 줄 도구 세트가 포함 된 ConnectBot 소스를 수정하여 APK를 작성할 수 있습니다.

명령 줄 도구의 경우 crosstool-ng를 사용하고 (uClibc에 링크 된) 정적으로 링크 된 도구 집합을 작성하는 것이 좋습니다. 그들은 커질 수도 있지만 분명히 작동 할 것입니다.

2

루트 액세스 권한이있는 경우 비지 박스 (google for instructions)를 설치하십시오.

+0

고마워! 그리고 지금 당장 비틀 거리는 사람에게는 비 루트 설치 프로그램을 사용할 수 있습니다. 비상시에는 grep 등을 내 타블렛과 함께 제공합니다. – herdingofthecats

+0

busybox는 이미 나의 플러스 3t에 있으며, 어떤 이유로 든 '상자'라고합니다. . – Amias

86

dirs를 복사하려면 장치에서 file/dir을 복사하려면 adb pull <remote> <local>을 사용하고 device/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

당신은 루트 권한없이 작업을 수행 할 수 있습니다 당신은 파일에 쓸 STANDART 입력을 사용하는 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 

때문에 나는이 유틸리티가 누락 된 일부 장치에 안드로이드를위한 경량 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과 거의 같습니다.

복사 후에는 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()에 : 나는해야했다. 사람이 아닌 뿌리 전화 adb shell 액세스 할 수 있도록 응용 프로그램의 디렉토리를 보호 해제 코드를 필요로 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); 
     } 
    } 

어떤 알 수없는 이유로 나는 읽을 수는 있지만 쓸 수 있지만.

0

Terminal-ide 장치를 사용하면 in play market을 설치할 것을 제안 할 수 있습니다. 그것의 무료, 뿌리를 요구하지 않으며 하나의 버튼 탭으로 이진 형태로 설치된 cp, find, du, mc 및 다른 많은 유틸리티와 같은 편리한 * nix 환경을 제공합니다.

관련 문제