刪除項(xiàng)目中未使用圖片的腳本
近來項(xiàng)目進(jìn)入收尾階段,需要的是不斷優(yōu)化項(xiàng)目,包括程序的運(yùn)行內(nèi)存、時(shí)間等等,同時(shí)也需要?jiǎng)h除掉項(xiàng)目中不需要的文件,在自購的[iOS開發(fā)進(jìn)階](http://item.jd.com/11598468.html)一書中發(fā)現(xiàn)了一個(gè)刪除圖片文件的腳本。
程序如下:
1. for i in \`find . -name "\*.png" -o -name "\*.jpg"\`; do
2. file=\`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x\`
3. result=\`ack -i "$file"\`
4. if [ -z "$result" ]; then
5 echo "$i"
#可更改為刪除
6. #rm "$i"
7. fi
8. done
上述項(xiàng)目使用到了一個(gè)基于“grep”高級(jí)封裝過的ack庫。所以在使用之前需先安裝ack庫到本機(jī)上(推薦使用brew安裝——在終端鍵入brew install ack即可).
注:略有些坑的是《iOS開發(fā)進(jìn)階》這本書的面向人群是iOS初級(jí)學(xué)習(xí)者,但是在書上卻絲毫沒有提到上述程序應(yīng)當(dāng)運(yùn)行——沒錯(cuò)上述程序無法直接運(yùn)行!!不得不說巧大神也有考慮不周的時(shí)候啊,沒有想到還有我等弱雞玩家~~ 這涉及到Linux下的多個(gè)命令以及bash shell的相關(guān)知識(shí)·· 遭遇如此情況,我只得拿出多年隨身攜帶的《鳥哥的Linux私房菜》來一一翻譯對(duì)照完善腳本來使用~~(誰叫咱弱呢··)。
可運(yùn)行程序如下:
1. PATH=/bin:/usr/local/bin:~/bin:/sbin:/usr/bin
2. export PATH
3. for i in `find . -name "*.png" -o -name "*.jpg"`; do
4. file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x`
5. result=`ack -i "$file"`
6. if [ -z "$result" ]; then
7. echo "$i"
8. #可更改為刪除
9. #rm "$i"
10. fi
11. done
原理:
從當(dāng)前文件目錄中遞歸搜索出后綴名為.png和.jpg的文件——A
從當(dāng)前文件目錄中遞歸搜索出其他文件——B
將A中的所有文件名在B中所有文件的內(nèi)容中搜索,如果檢索出來的結(jié)果是假(表明A中某文件沒有被使用),則打印(也克刪除)出A中的該文件。
1、2——聲明接下來的語句中使用的命令存放的文件夾,當(dāng)執(zhí)行命令時(shí),則直接進(jìn)入該文件夾路徑內(nèi)尋找。(:號(hào)是文件夾分隔符)
3——是forin結(jié)構(gòu)相信諸位iOS開發(fā)者是非常屬性的,遍歷find命令找到的文件.(find后面的.的含義是當(dāng)前目錄,-name是指定文件名,號(hào)表示0-n個(gè)字符的通配,-o 是or的含義*)
4——是為變量file賦值,其中使用了basename命令、xargs命令以及至關(guān)重要的 | 管道。(如果對(duì)bash shell感興趣,對(duì)管道和xargs命令的深入學(xué)習(xí)是必不可少的)
5——使用了ack命令。
6——是bash shell里面的if使用方式,-z 表示判定后面的文件是否為空。
7——是打印
8,9——加了#號(hào)表明是注釋的語句,rm 是刪除命令。
10——是if fi 的搭配。(bash shell語法)
11——是for in ; do done 的 for循環(huán)語句搭配(bash shell語法)