Bash
用於處理某個目錄中的文件的 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
.
腳本在執行時需要一個參數。這個參數是
*.apk
駐留的目錄。在腳本中
cd $1
逐行呼叫參數,這就是在 shell 腳本中呼叫參數的方式。請嘗試以下列方式重新執行您的腳本:
sh cert.sh </path/where/apks/reside>
看看是否能解決您的問題?此外,在
for
循環之前添加rm -rf other
和rm -rf none
行以刪除與現有文件夾相關的錯誤。
腳本執行良好。如果不是,它就不會產生所有這些錯誤。
您有以下問題:
- …\test1 目錄中沒有任何後綴為 .apk 的文件,並且您的腳本還沒有被編寫來處理這種錯誤。*.odex 同上。
2_ 該腳本希望能夠創建目錄
none
和other
,但它們已經存在(並且似乎是文件而不是目錄)並且它不知道如何處理它,因此它輸出錯誤。您的其餘錯誤與上述有關。
建議:
- 如果您沒有 *.apk 文件,則註釋掉整個
if
語句。否則移動到包含它們的目錄。2)刪除文件
none
,other
如果不需要的話。如果它們保留為文件,那麼您的腳本將永遠不會創建這些目錄。