我有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 other
和rm -rf none
行以删除与现有文件夹相关的错误。
答案2
该脚本执行良好。如果不是的话,它就不会产生所有这些错误。
您有以下问题:
1)您的...\test1目录中没有任何后缀为.apk的文件,并且您的脚本尚未编写来处理此类错误。 *.odex 也是如此。
2_ 脚本期望能够创建目录none
和other
,但它们已经存在(并且似乎是文件而不是目录)并且它不知道如何处理它,因此它输出错误。
您的其余错误与上述相关。
建议:
1) 如果您没有 *.apk 文件,则注释掉整个if
语句。否则移动到包含它们的目录。
none
2) 删除不需要other
的文件。如果它们保留为文件,那么您的脚本将永远不会创建这些目录。