2

我正在尝试编写一个使用 apktool 反编译多个 .apk 文件的 bash 脚本。每个 apk 文件都位于示例文件夹的子目录中。

#!bin/bash


for item in $(ls samples);
do
        for apk in $(ls "samples/$item");
        do 
            echo ./apktool/apktool d "./samples/$item$apk" 
            $(./apktool/apktool d "./samples/$item$apk")
        done    
done

当我运行脚本时,我得到以下输出:

./apktool/apktool d ./samples/ADRD/53dc.apk*
Input file (./samples/ADRD/53dc.apk*) was not found or was not readable.

输入文件错误消息是 apktool 找不到文件时的标准。但是,如果我在终端中运行以下命令,apktool 将正常工作。

./apktool/apktool d ./samples/ADRD/53dc.apk*

我已将示例文件夹中所有文件的权限更改为所有用户的 rw。我也尝试过将 sudo 与 shell 脚本一起使用,但这会导致脚本挂起。但是,当我在命令行中将 sudo 与 apktool 一起使用时,它也会挂起。因此,我不确定将 sudo 与 apktool 一起使用是否可行。

任何帮助表示赞赏,谢谢。

4

1 回答 1

2

所以看起来这ls会给你一个输出,在 apk 文件名的末尾附加一个星号 *,因为该文件是可执行的。

    for apk in $(ls "samples/$item");

这不是 的默认行为ls,你得到这个可能是因为你有别名或类似的lsls -F要绕过别名,请以这种方式重写该行:

    for apk in $(\ls "samples/$item");

注意我在那里添加的\。

顺便说一句,apk文件是可执行的正常吗?也许您可以删除可执行位:

find samples -name '*.apk' -exec chmod -x {} \;

此外,可能您的脚本可以替换为这一行:

find samples -name '*.apk' -exec ./apktool/apktool d {} \;

请注意,这并不完全相同,因为它可能比两个目录更深。如果您需要限制深度,这也是可能的,请参阅man find

于 2015-10-31T07:45:23.067 回答