2011-01-17 11 views
61

Powłoka Androida nie ma komendy cp. Powłoka z systemem Android również nie ma wartości sed lub grep lub vi. Nie mam dostępnego demona adb. Istnieje polecenie mv, ale odrzuca ono działanie, jeśli źródło znajduje się na urządzeniu tylko do odczytu.Jak kopiować i edytować pliki w powłoce Androida?

  1. Co zrobić, jeśli muszę skopiować rekursywnie niektóre katalogi z urządzenia tylko do odczytu?
  2. Jak zmienić wiersz w pliku tekstowym (np. "PATH =/cache" na "PATH =/mnt/asec")?
+0

Czy któreś z dostarczonych rozwiązań działają dla Ciebie? – gnclmorais

+0

@MEGA: jak już powiedziałem, nie ma zainstalowanego adb. Mogę skopiować za pomocą polecenia "cat src> dst", ale nie wiem jak zrobić to rekursywnie? – psihodelia

+0

Nie rozumiem. Aby uzyskać dostęp do powłoki, wpisz './adb shell'. Jeśli mówisz, że nie masz dostępnego "Adb'a", w jaki sposób możesz uzyskać dostęp do powłoki? – gnclmorais

Odpowiedz

16

Najpopularniejsza odpowiedź jest prosta: załóż kilka aplikacji (busybox?) Za pomocą APK (zakładając, że chcesz go użyć w aplikacji). O ile mi wiadomo, partycja/data nie jest podłączona do noexec, a nawet jeśli nie chcesz wdrażać pełnoprawnego pliku APK, możesz zmodyfikować źródła ConnectBot, aby zbudować pakiet APK z dołączonym zestawem narzędzi wiersza poleceń.

W przypadku narzędzi wiersza polecenia zalecam stosowanie crosstool-ng i tworzenie zestawu statycznie połączonych narzędzi (połączonych z uClibc). Mogą być duże, ale na pewno będą działać.

2

Jeśli masz uprawnienia administratora, to zainstaluj busybox (google for instructions).

+0

Dzięki! I dla każdego, kto natknie się na to teraz, jest teraz dostępny instalator inny niż root, który dał mi grep itp. W sytuacji awaryjnej tylko z moim tabletem :) – herdingofthecats

+0

busybox jest już na moim plusie 3t, nazywany jest "pudełkiem" z jakiegoś powodu . – Amias

86

Do skopiowania katalogów, wydaje się, że możesz użyć adb pull <remote> <local>, jeśli chcesz skopiować plik/katalog z urządzenia, i , aby skopiować plik/katalog do urządzenia. Alternatywnie, aby skopiować plik, możesz użyć prostej sztuczki: cat source_file > dest_file. Zauważ, że to nie działa w przypadku niedostępnych dla użytkownika ścieżek.

Aby edytować pliki, nie znalazłem prostego rozwiązania, tylko niektóre możliwe obejścia. Wypróbuj this, wydaje się, że możesz (po instalacji) użyć go do edycji plików, takich jak busybox vi <filename>. Nano wydaje się również być possible to use.

+14

Niestety, 'adb pull' /' adb push' nie działa z niedostępnymi dla użytkownika ścieżkami. – ulidtko

+2

Pomogło mi odzyskać ponad 500 zdjęć i filmów z niedostępnej partycji kart SD.Dzięki :) – Phantomwhale

+0

Ten plik binarny nie działa na najnowszych telefonach –

4

Również, jeśli celem jest tylko dostęp do plików w telefonie. Istnieje Eksplorator plików, który jest dostępny z perspektywy środowiska DDMS Eclipse. Pozwala kopiować pliki zi do urządzenia. Możesz więc zawsze pobrać plik, zmodyfikować go i ponownie umieścić na urządzeniu. Oczywiście umożliwia dostęp tylko do plików, które nie są chronione przed odczytem.

Jeśli nie widzisz Eksploratora plików, z perspektywy DDMS przejdź do "Okno" -> "Pokaż widok" -> "Eksplorator plików".

+0

działa tylko na emulatorze – user1324936

28

Można to zrobić bez uprawnień roota:

cat srcfile > /sdcard/dstfile 
+0

czy działa również dla plików binarnych? lub po prostu działa dla plików TEXT? – VSB

+4

tak, działa również z plikami binarnymi – Viriatvs

+0

Myślę, że lepiej jest zaktualizować ścieżkę karty SD do/mnt/sdcard/... – VSB

9

Można użyć cat > filename używać standart wejście do zapisu pliku. Na koniec musisz umieścić EOF CTRL+D.

3

Ponieważ polityka uprawnień na moim urządzeniu jest trochę paranoiczna (nie mogę danych aplikacji adb pull), napisałem skrypt do rekurencyjnego kopiowania plików.

Uwaga: ten skryptowy skrypt rekurencyjny jest przeznaczony dla systemu Android!

kopiowaniem 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 

Tu podać źródło lekkiej find dla Androida, ponieważ na niektórych urządzeniach tego narzędzia jest zaginionych. Zamiast myfind można użyć find, jeśli jest zdefiniowany na urządzeniu.

Wyposażenie:

$ adb push copy-r /sdcard/ 

, pracującym w adb shell (korzenie)

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

lub

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

(Wartość mieszania # powyżej jest su szybka, a . jest polecenie co powoduje, że powłoka uruchamia określony plik, prawie taki sam jak source).

Po skopiowaniu mogę adb pull pliki z karty SD.

Zapisywanie plików w katalogu aplikacji było trudniejsze, próbowałem ustawić uprawnienia r/w na files i jego podkatalogach, to nie działało (no cóż, pozwalało mi to czytać, ale nie pisać, co jest dziwne), więc musiałem zrobić:

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

w aplikacji onCreate().

PS tylko w przypadku, gdy ktoś potrzebuje kod do usunięcia ochrony katalogów aplikacji, aby umożliwić adb shell dostęp on non-zakorzenione telefon,

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

chociaż dla jakiegoś nieznanego powodu mogę czytać ale nie pisać.

0

Mogę zaproponować instalację Terminal-ide na twoim urządzeniu, które jest dostępne pod numerem in play market. Jest bezpłatny, nie wymaga korzenia i zapewnia wygodne środowisko * nix, takie jak cp, find, du, mc i wiele innych narzędzi, które zostały zainstalowane w formie binarnej za pomocą jednego dotknięcia przycisku.

Powiązane problemy