shell腳本,替換xcasset圖片名稱

1、背景
xcasset是蘋果為iOS開發(fā)者提供的高效文件圖片尋址,slicing,圖片分包的圖片文件管理工具。
xcasset中圖片結(jié)構(gòu)如圖,每張圖片根據(jù)機(jī)型不同,像素大小也不同。2x,3x圖片在imageset文件夾下,同時(shí)還有一個(gè)contents.json文件標(biāo)識(shí)1x,2x,3x圖片分別是哪張。

imageSet.png

2、使用習(xí)慣不好帶來困擾
有時(shí)開發(fā)時(shí)為了方便,直接不改圖片名稱直接將圖片拖拽到imageset中,為了代碼可讀性,工程開發(fā)往往約定好圖片的命名規(guī)則,所以imageset的命名要比真實(shí)圖片名(實(shí)體文件名)規(guī)則,app運(yùn)行的時(shí)候加載圖片是根據(jù)imageset的名稱加載的(索引名),所以真實(shí)圖片名怎么起都不會(huì)有影響。下圖是索引名和實(shí)體文件名不一樣的情況


differentName.png

下圖是content.json的內(nèi)容


share.png

3、解決方法
這么做可能會(huì)對(duì)之后的無用圖片排查,為了減少包大小進(jìn)行圖片壓縮造成一定的困擾,所以索引名和實(shí)體文件名盡量一致。
為了解決不一致現(xiàn)象,可以手動(dòng)修改實(shí)體文件名,但圖片太多又顯得枯燥,改后的一段時(shí)間再經(jīng)若干迭代還會(huì)有這種現(xiàn)象出現(xiàn)??梢杂媚_本解決這個(gè)問題,快速,方便,還可以和小伙伴吹牛。

4、原理
腳本需要做三件事
1)遍歷工程中所有 .imageset文件,找到索引名和實(shí)體文件名不一樣的圖片。
2)將1x,2x,3x圖片名稱改為和 .imageset的文件名稱一致。
3)將contents.json文件中的圖片名稱也替換為 .imageset的文件名。

5、使用方式
sh /Users/liyi/Desktop/sh/file_name.sh /Users/liyi/Desktop/sh/TestDir
如下圖
sh的意思是執(zhí)行shell腳本, /Users/liyi/Desktop/sh/file_name.sh 是腳本所在路徑,/Users/liyi/Desktop/sh/TestDir是所要操作的iOS工程的文件夾,這樣就可以將工程下所有索引名和實(shí)體文件名的圖片名都替換為索引名。


use.png

6、代碼

#!/bin/bash
#echo -e "please drag a file or input dile name \n"
#read dirPath

#d_suffix :文件夾后綴
#sub_path :文件夾后綴
#dir_or_file :文件除了文件名稱的路徑
#real_name :imageset之前的名稱(沒有后綴)
#finial_old_name :修改前的圖片名(帶后綴)
#finial_real_name :修改后的圖片名(帶后綴)

#找到png的后綴
suffix="png"
image_2x_suffix="@2x.png"
image_3x_suffix="@3x.png"
image_1x_suffix="@.png"
content_suffix=".json"
picture_d_suffix="imageset"

#content.json文件中字符串替換
function changeContentFile() {
    origin_name="$1"
    new_name="$2"
    contentPath="$3"
    if test "$new_name" != "_"
        then
        sed -i "" "s/$origin_name/$new_name/g" "$content_path"
    fi
}

#尋找需要替換的文件
function findFile() {
for file in `ls $1`
    do
        dir_or_file=$1"/"$file
        if test -d $dir_or_file
            then
                d_suffix=${file:0-8:8}
                #如果后綴是imageset
                if test "$d_suffix" = "$picture_d_suffix"
                    then
                    sub_path=$dir_or_file"/"
                    real_name=${dir_or_file##*/}
                    real_name=${real_name%.*}
                    before_1x_name="_"
                    before_2x_name="-"
                    before_3x_name="-"
                    finial_1x_real_name="_"
                    finial_2x_real_name="_"
                    finial_3x_real_name="_"
                    #算出改名后的名字
                    for subfile in `ls $sub_path`
                        do
                            finial_old_name=${subfile##*/}
                            finial_new_name="-"
#2x圖片
                            if test "${finial_old_name:0-7:7}" = "$image_2x_suffix"
                                then
                                before_2x_name=$subfile
                                finial_new_name=$sub_path$real_name$image_2x_suffix
                                if test "$sub_path$subfile" != "$finial_new_name"
                                    then
                                    finial_2x_real_name=$real_name$image_2x_suffix
                                    mv $sub_path$subfile $finial_new_name
                                fi

                            fi
#3x圖片
                            if test "${finial_old_name:0-7:7}" = "$image_3x_suffix"
                                then
                                before_3x_name=$subfile
                                finial_new_name=$sub_path$real_name$image_3x_suffix
                                if test "$sub_path$subfile" != "$finial_new_name"
                                    then
                                    finial_3x_real_name=$real_name$image_3x_suffix
                                    mv $sub_path$subfile $finial_new_name
                                fi

                            fi
#1x圖片
                            if test "${finial_old_name:0-4:4}" = "$image_1x_suffix"
                                then
                                before_1x_name=subfile
                                finial_new_name=$sub_path$real_name$image_1x_suffix
                                if test "$sub_path$subfile" != "$finial_new_name"
                                    then
                                    finial_1x_real_name=$real_name$image_1x_suffix
                                    mv $sub_path$subfile $finial_new_name
                                fi
                            fi
                    
                        done
#content.json文件
                content_path=$sub_path"Contents.json"
                changeContentFile $before_1x_name $finial_1x_real_name $content_path
                changeContentFile $before_2x_name $finial_2x_real_name $content_path
                changeContentFile $before_3x_name $finial_3x_real_name $content_path
            else
                findFile $dir_or_file
            fi
        fi
    done
}

root_dir="$1"
findFile $root_dir

7、修改后
執(zhí)行過后產(chǎn)生的diff如下圖


腳本執(zhí)行后的diff.png

上邊代碼換行看著很不舒服,截圖一張

代碼截圖.png

看到最后辛苦了,希望對(duì)你有幫助
多謝觀看?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容