美文网首页
shell脚本,替换xcasset图片名称

shell脚本,替换xcasset图片名称

作者: 李易_64c1 | 来源:发表于2019-01-26 23:55 被阅读0次

    1、背景
    xcasset是苹果为iOS开发者提供的高效文件图片寻址,slicing,图片分包的图片文件管理工具。
    xcasset中图片结构如图,每张图片根据机型不同,像素大小也不同。2x,3x图片在imageset文件夹下,同时还有一个contents.json文件标识1x,2x,3x图片分别是哪张。

    imageSet.png

    2、使用习惯不好带来困扰
    有时开发时为了方便,直接不改图片名称直接将图片拖拽到imageset中,为了代码可读性,工程开发往往约定好图片的命名规则,所以imageset的命名要比真实图片名(实体文件名)规则,app运行的时候加载图片是根据imageset的名称加载的(索引名),所以真实图片名怎么起都不会有影响。下图是索引名和实体文件名不一样的情况


    differentName.png

    下图是content.json的内容


    share.png

    3、解决方法
    这么做可能会对之后的无用图片排查,为了减少包大小进行图片压缩造成一定的困扰,所以索引名和实体文件名尽量一致。
    为了解决不一致现象,可以手动修改实体文件名,但图片太多又显得枯燥,改后的一段时间再经若干迭代还会有这种现象出现。可以用脚本解决这个问题,快速,方便,还可以和小伙伴吹牛。

    4、原理
    脚本需要做三件事
    1)遍历工程中所有 .imageset文件,找到索引名和实体文件名不一样的图片。
    2)将1x,2x,3x图片名称改为和 .imageset的文件名称一致。
    3)将contents.json文件中的图片名称也替换为 .imageset的文件名。

    5、使用方式
    sh /Users/liyi/Desktop/sh/file_name.sh /Users/liyi/Desktop/sh/TestDir
    如下图
    sh的意思是执行shell脚本, /Users/liyi/Desktop/sh/file_name.sh 是脚本所在路径,/Users/liyi/Desktop/sh/TestDir是所要操作的iOS工程的文件夹,这样就可以将工程下所有索引名和实体文件名的图片名都替换为索引名。


    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、修改后
    执行过后产生的diff如下图


    脚本执行后的diff.png

    上边代码换行看着很不舒服,截图一张

    代码截图.png

    看到最后辛苦了,希望对你有帮助
    多谢观看☺

    相关文章

      网友评论

          本文标题:shell脚本,替换xcasset图片名称

          本文链接:https://www.haomeiwen.com/subject/ymjijqtx.html