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

也就是说

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

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

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

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

小白读iOS冗余资源扫描脚本的更多相关文章

  1. iOS项目冗余资源扫描脚本

    iOS项目冗余资源扫描脚本 随着iOS项目的版本不断迭代,app中冗余文件会越来越多,app size也持续增加,是时候需要对app冗余资源进行检测,对app进行瘦身. 使用方法: 1. 运行环境为m ...

  2. iOS 学习资源

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  3. 超全!整理常用的iOS第三方资源(转)

    超全!整理常用的iOS第三方资源 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地 ...

  4. iOS使用Zbar扫描二维码

    iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...

  5. fir.im Weekly - 94 个 iOS 开发资源推荐

    距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...

  6. 【资源集合】94个iOS开发资源推荐,帮你加速应用开发

    资源总结类文章总是开发者们所喜欢的,网上已经有各种weekly.头条以及期刊类资源总结,今天这篇来自于开发者Viswateja Reddy的总结.原文对各个项目的介绍非常简单,为了更便于阅读,编辑在原 ...

  7. redis的bigkey扫描脚本

    众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...

  8. Python 网站后台扫描脚本

    Python  网站后台扫描脚本 #!/usr/bin/python #coding=utf-8 import sys import urllib import time url = "ht ...

  9. Linux shell编写端口扫描脚本

    Linux shell编写端口扫描脚本 需求: 扫描特定主机 扫描特定主机的特定端口 扫描特定网段 扫描特定网段中哪些主机开放了特定的端口 源码如下: #/bin/bash #该脚本用于对特定目标主机 ...

随机推荐

  1. GCTF2017部分write up

    Misc stage1 拿到题看到是一张图片隐写 用神器Stegsolve看看发现左上角藏着一张二维码 截下来,不能直接扫,需要反色处理一下 扫出来是一串十六进制 看头几个十六进制数发现是pyc文件 ...

  2. C# servicestack.redis 互通 java jedis

    拥抱变化,如今也走上了.net/java通吃的时代,下面就讲讲如何让.net/java都能正常访问分片的redis吧. 有几个关键点:一致性环哈希.哈希算法.序列化.反序列化 后两个都比较直接,只要选 ...

  3. post和get方式区别

    Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.1. get是把参数数据队列加到提交表单的ACTI ...

  4. 基于Spring的最简单的定时任务实现与配置(一)

    朋友的项目中有点问题.他那边是Spring架构的,有一个比较简单的需要定时的任务执行.在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式. 注意本文只是讨论,在已搭建完毕的 ...

  5. 移动端APP CSS Reset及注意事项CSS重置

    @charset "utf-8"; * { -webkit-box-sizing: border-box; box-sizing: border-box; } //禁止文本缩放 h ...

  6. Jenkins插件开发

    一.环境配置 不赘述,直接看wiki:https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins 二.内容说明 1.插件代码结构 src/main/j ...

  7. ASP.NET 导出EXCEL文件处理多对应排列的

    这次项目遇到了一个导出excel需要对应排列的问题.本来在做这个项目之前都基本没做过excel导出的菜鸡,这次强行做还是有些忐忑的,加上那个表的结构比较奇特.    废话不多说,先介绍表结构吧 是数据 ...

  8. ES6的十大特性和认知

    ---恢复内容开始--- ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率.本文主要针对E ...

  9. DOM编程从入门到忘记

    文档对象模型(Document Object Model,DOM)是使用 W3C 定义的 API (Application Program Interface) 来操作 HTML 文档 (此处不局限于 ...

  10. 三、SolrCloud的搭建

    本次安装是单台虚拟机安装,所以采用伪集群的方式进行安装,如果是真正的生产环境,将伪集群的ip改下就可以了,步骤是一样的. SolrCloud结构图如下: 环境准备: CentOS-6.4-i386-b ...