小白讀iOS冗餘資源掃描指令碼

滴水微瀾發表於2017-07-31

隨著公司專案的不斷功能迭代,專案的體積越來越大,各種瘦身策略迫在眉睫。由於平時使用Linux高階命令和

shell指令碼的機會不多,之前學的知識一下子想起來很難。所有趁著這次看指令碼,重新溫習一下。

本文的指令碼資訊參考部落格:iOS專案冗餘資源掃描指令碼(http://www.cnblogs.com/Boohee/p/5598313.html

指令碼解讀如下:

 

#!/bin/sh
 
##### several cases that the scripts does not work:
##### 1) there is space or slash in the resources file, such as "aaa .png" 資原始檔名中含有空格或者/
##### 2) reference resources in commented code 資源引用程式碼被註釋了
##### 3) you need to manually checked the resources one by one in the result 對於指令碼檢查結果,最好人工檢查一遍
##### 4) you can add some other types more than png, jpg, gif, wav, m4a 如果需要檢查其他資源,請自行修改指令碼;
##### 5)預設檔案字尾都是如@2x.png格式,如果字尾格式不同,請自行修改指令碼;
 
 
#### set parameters:PrjPath為專案工程所在目錄,包含.m .xib檔案;ResPath為被掃描的資原始檔目錄,包含.png .wav
#### xcodeprojPath為工程xcodeproj位置
PrjPath=/Users/...
ResPath=/Users/...
xcodeprojPath=/Users/...
 
##如果存在檔案resource_san_result.txt 
if [ -f ~/Desktop/resource_san_result.txt ];then
    rm -f ~/Desktop/resource_san_result.txt
fi
 
 
##進入到工程目錄下
cd $PrjPath
##搜尋獲取當前目錄以己其子目錄下以"*.m","*.xib","*.mm","*.plist"結尾檔名的檔案 (find .)從當前目錄以及子目錄中搜尋
files=$(find . -name "*.m" -o -name "*.xib" -o -name "*.mm" -o -name "*.plist")

##進入到資源目錄下
cd $ResPath
##搜尋獲取當前目錄以己其子目錄下以"*.png","*.jpg","*.gif","*.wav","*.m4a"結尾檔名的檔案, 並遍歷檔案
for png in $(find . -name "*.png" -o -name "*.jpg" -o -name "*.gif" -o -name "*.wav" -o -name "*.m4a")
do
 
    ##在圖片完整路徑前拼接基本名稱
    basename='basename/'$png
    ##按照從前往後的方向,截去最大匹配欄位,並附給變數basename
    basename=${basename##*/}
    # echo $basename
 
    ##按照從前往後的方向,截去最大匹配欄位,判斷餘下的字串是否等於‘png’
    if [ "${basename##*.}" == "png" ];then
        ##判斷圖片名稱中是否包含@2x.png字串,包含返回0
        echo $basename|grep -q @2x.png
        ##判斷上一步執行是否正確
        if [ $? -eq 0 ];then
            ##將圖片名稱按照從後往前的方向,截去最大匹配欄位,並附給變數name
            name=${basename%%@2x.png}
        else
            ##如果圖片名稱中不含@2x.png,則進行其他情況判斷
            echo $basename|grep -q @3x.png
            if [ $? -eq 0 ];then
                ##如果圖片名稱中包含@3x.png,則圖片名稱按照從後往前的方向,截去最大匹配欄位,並附給變數name
                name=${basename%%@3x.png}
            else
                ##最後,圖片名稱按照從後往前的方向,截去最大匹配欄位,並附給變數name
                name=${basename%.png}
            fi
        fi
 
    ##同樣的策略,對jpg圖片的判斷
    elif [ "${basename##*.}" == "jpg" ];then
        echo $basename|grep -q @2x.jpg
        if [ $? -eq 0 ];then
            name=${basename%%@2x.jpg}
        else
            echo $basename|grep -q @3x.jpg
            if [ $? -eq 0 ];then
                name=${basename%%@3x.jpg}
            else
                name=${basename%%.jpg}
            fi
        fi
    ##同樣的策略,對gif圖片的判斷
    elif [ "${basename##*.}" == "gif" ];then
        echo $basename|grep -q @2x.gif
        if [ $? -eq 0 ];then
            name=${basename%%@2x.gif}
        else
            echo $basename|grep -q @3x.gif
            if [ $? -eq 0 ];then
                name=${basename%%@3x.gif}
            else
                name=${basename%%.gif}
            fi
        fi
    ##同樣的策略,對wav圖片的判斷
    elif [ "${basename##*.}" == "wav" ];then
        name=${basename%%.wav}
    ##同樣的策略,對m4a圖片的判斷
    elif [ "${basename##*.}" == "m4a" ]; then
        name=${basename%%.m4a}
    ##都不符合時,名稱變成“”空字串
    else
        name=''
    fi
 
    ##對圖片名稱進行過濾,如果圖片名稱長度大於0時
    if [ ${#name} -gt 0 ];then
        # # name=${name%%[0-9]*}
        ##進入工程目錄
        cd $PrjPath
        ##判斷工程檔案中是否包含圖片名稱
        if grep -q $name $files;then
            echo "$png" is used
 
        else
            ##如果工程檔案中不包含圖片名,進入配置檔案目錄下
            cd $xcodeprojPath
            ##配置檔案中包含圖片名稱,圖片沒有使用
            if grep -q $name project.pbxproj;then
                echo "$png" is not used >> ~/Desktop/resource_san_result.txt
            else
                ##配置檔案中也不包含圖片名稱
                echo "$png" is not packaged
            fi
        fi
    ##圖片名稱長度為0時
    else
        echo name is empty
    fi
 
done
 
##如果存在檔案resource_san_result.txt 
if [ -f ~/Desktop/resource_san_result.txt ]; then
    echo ***************the end of scan. Please see result from resource_san_result.txt
else
    echo ***************the end of scan, everything is OK
fi

命令使用參考:

一、 [ -f $filename ] 命令

if [ -f $filename ];then

    echo "存在這個有效的檔案";

fi

 

二、Find命令 的使用

檔案查詢

find .(當前目錄) -name 

find . -name "*.txt" -print

find . -name '[A-Z,a-z,1-100]*'.txt -print

find . -name "1.txt" -prune -o -name "*.txt" -print

目錄查詢

find . -path"./aa " -prune -o -name "*.txt" -print

find . -path"./aa " -prune -o -path "./bb" -prune -o -name "*.txt" -print

grep 匹配

cat 1.txt | grep all --color只要出現all   cat 1.txt | grep -w "all" 匹配單詞

cat -n 

取反

 cat 1.txt | grep -v -w "all" 

統計次數

 cat 1.txt | grep -c "all"

三、grep命令用法

grep(global search regular expression(RE) and print out the line,全面搜尋正規表示式並把行列印出來)是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹配的行列印出來。

在檔案中搜尋一個單詞,命令會返回一個包含“match_pattern”的文字行:

grep match_pattern file_name 

grep "match_pattern" file_name

在多個檔案中查詢:

grep "match_pattern" file_1 file_2 file_3 ...

grep靜默輸出:

grep -q "test" filename #不會輸出任何資訊,如果命令執行成功返回0,失敗則返回非0值。一般用於條件測試。

 

三、if [ $? -eq 0 ];then 命令解釋:

$0: shell或shell指令碼的名字

$*:以一對雙引號給出引數列表

$@:將各個引數分別加雙引號返回

$#:引數的個數

$_:代表上一個命令的最後一個引數

$$:代表所在命令的PID

$!:代表最後執行的後臺命令的PID

$?:代表上一個命令執行後的退出狀態

 

四、${i##*/} 和 ${name%%/*}   命令解釋:

#!/bin/sh
files=`find -name *.conifg`
for i in $files
do
  name=${i#*/}

  name2=${i##*/}
  dir=${name%/*}

  dir2=${name%%/*} 
done

name和dir都代表什麼呢?

i=this/is/a/path.config

 

name=is/a/path.config

name2=path.config

dir=this/is/a

dir=this

也就是說

#代表刪除從前往後最小匹配的內容

##代表刪除從前往後最長匹配的內容

 

%代表刪除從後往前最小匹配的內容

%%代表刪除從後往前最長匹配的內容

 

相關文章