• 小白读iOS冗余资源扫描脚本


    随着公司项目的不断功能迭代,项目的体积越来越大,各种瘦身策略迫在眉睫。由于平时使用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

    也就是说

    #代表删除从前往后最小匹配的内容

    ##代表删除从前往后最长匹配的内容

    %代表删除从后往前最小匹配的内容

    %%代表删除从后往前最长匹配的内容

  • 相关阅读:
    JSON数据
    逆序字符串
    WPF中ListBox ListView数据翻页浏览笔记(强调:是数据翻页,非翻页动画)
    用WPF做关于MEF 简单学习记录
    C#关于XML的一些简单用法
    django框架-DRF视图中的request和response
    django框架-Admin管理站点搭建
    JZ35 数组中的逆序对
    JZ34 第一个只出现一次的字符位置
    JZ33 丑数
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/7266096.html
Copyright © 2020-2023  润新知