Bash

用於處理某個目錄中的文件的 Shell 腳本

  • August 25, 2018

我有一個 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.

腳本在執行時需要一個參數。這個參數是*.apk駐留的目錄。

在腳本中cd $1逐行呼叫參數,這就是在 shell 腳本中呼叫參數的方式。

請嘗試以下列方式重新執行您的腳本:sh cert.sh </path/where/apks/reside>看看是否能解決您的問題?

此外,在for循環之前添加rm -rf otherrm -rf none行以刪除與現有文件夾相關的錯誤。

腳本執行良好。如果不是,它就不會產生所有這些錯誤。

您有以下問題:

  1. …\test1 目錄中沒有任何後綴為 .apk 的文件,並且您的腳本還沒有被編寫來處理這種錯誤。*.odex 同上。

2_ 該腳本希望能夠創建目錄noneother,但它們已經存在(並且似乎是文件而不是目錄)並且它不知道如何處理它,因此它輸出錯誤。

您的其餘錯誤與上述有關。

建議:

  1. 如果您沒有 *.apk 文件,則註釋掉整個if語句。否則移動到包含它們的目錄。

2)刪除文件noneother如果不需要的話。如果它們保留為文件,那麼您的腳本將永遠不會創建這些目錄。

引用自:https://unix.stackexchange.com/questions/149148