如何在Android shell中复制和编辑文件?

psi*_*lia 65 linux shell android sh android-ndk

Android shell没有cp命令.Android shell也没有sedgrepvi.我没有可用的adb守护进程.有mv命令,但如果源是在只读设备上,它拒绝工作.

  1. 如果我必须递归地从只读设备复制某些目录该怎么办?
  2. 如何更改文本文件中的一行(例如"PATH =/cache"为"PATH =/mnt/asec")?

gnc*_*ais 90

要复制目录,adb pull <remote> <local>如果要从设备adb push <local> <remote>复制文件/目录,并将文件/目录复制到设备,似乎可以使用.或者,只是为了复制文件,你可以使用一个简单的技巧:cat source_file > dest_file.请注意,这不适用于用户不可访问的路径.

要编辑文件,我还没有找到一个简单的解决方案,只是一些可能的解决方法.试试这个,似乎你可以(在设置之后)用它来编辑像这样的文件busybox vi <filename>.纳米似乎也可以使用.

  • 不幸的是,`adb pull` /`adb push`不适用于用户不可访问的路径. (17认同)
  • 刚刚帮助我从一个无法访问的SD卡分区中恢复了500多张照片和视频.谢谢 :) (2认同)

Vir*_*tvs 32

你可以在没有root权限的情况下完成:

cat srcfile > /mnt/sdcard/dstfile
Run Code Online (Sandbox Code Playgroud)


p_l*_*p_l 16

最常见的答案很简单:用你的APK捆绑几个应用程序(busybox?)(假设你想在应用程序中使用它).据我所知,/ data分区没有安装noexec,即使你不想部署一个完全成熟的APK,你也可以修改ConnectBot源来构建一个包含一组命令行工具的APK.

对于命令行工具,我建议使用crosstool-ng并构建一组静态链接工具(与uClibc链接).他们可能很大,但他们肯定会工作.


kub*_*ubo 9

您可以使用cat > filename标准输入来写入文件.最后你必须把EOF CTRL+D.


184*_*615 5

由于我的设备上的权限策略有点偏执(不能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
Run Code Online (Sandbox Code Playgroud)

在这里,我提供了 Android 的轻量级源代码,find因为在某些设备上缺少此实用程序。如果设备上定义了,则myfind可以使用。find

安装:

$ adb push copy-r /sdcard/
Run Code Online (Sandbox Code Playgroud)

运行在adb shell(扎根):

# . /sdcard/copy-r files/ /sdcard/files3 
Run Code Online (Sandbox Code Playgroud)

或者

# source /sdcard/copy-r files/ /sdcard/files3 
Run Code Online (Sandbox Code Playgroud)

(上面的hash#su提示符,而则.是导致shell运行指定文件的命令,和 几乎一样source)。

复制后,我可以adb pull从 SD 卡中获取文件。

将文件写入应用程序目录比较棘手,我尝试对其及其子目录设置读写权限files,但它不起作用(好吧,它允许我读取,但不能写入,这很奇怪),所以我必须这样做:

        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();
        }
Run Code Online (Sandbox Code Playgroud)

在应用程序的onCreate()中。

PS,以防万一有人需要代码来取消应用程序目录的保护,以便adb shell在未 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

尽管由于某种未知的原因我可以读但不能写。