隨著公司專案的不斷功能迭代,專案的體積越來越大,各種瘦身策略迫在眉睫。由於平時使用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
也就是說
#代表刪除從前往後最小匹配的內容
##代表刪除從前往後最長匹配的內容
%代表刪除從後往前最小匹配的內容
%%代表刪除從後往前最長匹配的內容