用于处理某个目录中的文件的 Shell 脚本

用于处理某个目录中的文件的 Shell 脚本

我有Windows系统,所以我下载了cygwin来帮助我执行Linux/unix命令。我需要对存储在文件夹内的一堆 APK 执行 shell 脚本(获取脚本这里)。

这是脚本:

#!/bin/bash
cd $1

for filename in *.apk
do
    unzip -d $filename.extract $filename META-INF/CERT.RSA
    if [ -f $filename.extract/META-INF/CERT.RSA ]
        then
        mkdir `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|grep SerialNumber| cut -c 19-23`
        mv $filename `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|grep SerialNumber| cut -c 19-23`/$filename
        mv `echo $filename | sed 's/\(.*\.\)apk/\1odex/'` `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|grep SerialNumber| cut -c 19-23`/`echo $filename | sed 's/\(.*\.\)apk/\1odex/'`
        rm -rf $filename.extract
    else
        mkdir none
        mv $filename none
        mv `echo $filename | sed 's/\(.*\.\)apk/\1odex/'` none
        rm -rf $filename.extract
    fi
done;

mkdir other
mv * other
mv other/b399 platform
mv other/f2a7 shared
mv other/f2b9 media
mv other/936e test

在终端中我执行命令sh cert.sh,但出现以下错误:

在此输入图像描述

奇怪的是,当我执行cert.sh -脚本时,它会运行并将我的 apk 分成不同的文件夹,但我不确定它是否正确运行,因为运行 shell 脚本的正确命令是sh cert.sh

答案1

该脚本在执行时需要一个参数。该参数是所在的目录*.apk

参数在脚本中按cd $1行调用,这就是 shell 脚本中调用参数的方式。

请尝试按以下方式重新运行您的脚本:sh cert.sh </path/where/apks/reside>看看这是否可以解决您的问题?

另外,在for循环之前添加rm -rf otherrm -rf none行以删除与现有文件夹相关的错误。

答案2

该脚本执行良好。如果不是的话,它就不会产生所有这些错误。

您有以下问题:

1)您的...\test1目录中没有任何后缀为.apk的文件,并且您的脚本尚未编写来处理此类错误。 *.odex 也是如此。

2_ 脚本期望能够创建目录noneother,但它们已经存在(并且似乎是文件而不是目录)并且它不知道如何处理它,因此它输出错误。

您的其余错误与上述相关。

建议:

1) 如果您没有 *.apk 文件,则注释掉整个if语句。否则移动到包含它们的目录。

none2) 删除不需要other的文件。如果它们保留为文件,那么您的脚本将永远不会创建这些目录。

相关内容