小白读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
也就是说
#代表删除从前往后最小匹配的内容
##代表删除从前往后最长匹配的内容
%代表删除从后往前最小匹配的内容
%%代表删除从后往前最长匹配的内容
小白读iOS冗余资源扫描脚本的更多相关文章
- iOS项目冗余资源扫描脚本
iOS项目冗余资源扫描脚本 随着iOS项目的版本不断迭代,app中冗余文件会越来越多,app size也持续增加,是时候需要对app冗余资源进行检测,对app进行瘦身. 使用方法: 1. 运行环境为m ...
- iOS 学习资源
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- 超全!整理常用的iOS第三方资源(转)
超全!整理常用的iOS第三方资源 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地 ...
- iOS使用Zbar扫描二维码
iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...
- fir.im Weekly - 94 个 iOS 开发资源推荐
距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...
- 【资源集合】94个iOS开发资源推荐,帮你加速应用开发
资源总结类文章总是开发者们所喜欢的,网上已经有各种weekly.头条以及期刊类资源总结,今天这篇来自于开发者Viswateja Reddy的总结.原文对各个项目的介绍非常简单,为了更便于阅读,编辑在原 ...
- redis的bigkey扫描脚本
众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...
- Python 网站后台扫描脚本
Python 网站后台扫描脚本 #!/usr/bin/python #coding=utf-8 import sys import urllib import time url = "ht ...
- Linux shell编写端口扫描脚本
Linux shell编写端口扫描脚本 需求: 扫描特定主机 扫描特定主机的特定端口 扫描特定网段 扫描特定网段中哪些主机开放了特定的端口 源码如下: #/bin/bash #该脚本用于对特定目标主机 ...
随机推荐
- 零基础开始学python
变量规则:在python中变量名不能有特殊字符和数字开头以及python里的一些关键字,可以使用下划线开头,在python里,变量是支持使用中文的,但尽量不要使用中文,为什么?因为这样会让你看起来太l ...
- mac中使用 sourcetree 的快速配置和git服务器登录
问题: 1.mac中下载sourcetree配置仓库地址,一直在提示输入密码,无法登录成功,更无法获取源码. 2.找不到配置仓库时的账号密码,只看到地址. 场景: git服务器:自己的GIT服务器,非 ...
- GA代码中的细节
GA-BLX交叉-Gaussion变异 中的代码细节: 我写了一个GA的代码,在2005测试函数上一直不能得到与实验室其他同学类似的数量级的结果.现在参考其他同学的代码,发现至少有如下问题: 1.在交 ...
- w3c编程挑战-初级脚本算法
之前偶然看到了w3c上的编程挑战题,就像拿来试试手,先做的是初级脚本算法,总体不难,如果有更好的方法,希望能一起交流! 1.翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序 ...
- java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘
15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...
- select onchagnge 弹出自己的文本值
select onchagnge 弹出自己的文本值onchange='alert($("option:selected",this).text())'
- IOS 状态栏(UIStatusBar)
ios上状态栏指的屏幕顶端的20像素高的部分 状态栏分前景和背景两部分 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示白色或者图片的背景部分: 如下图:前景部分为黑色字体,背景部分为白色 ...
- Bootstrap table使用心得---thead与td无法对齐的问题
当使用工具条中的显示/隐藏列的时候, 经常出现表格的列头与内容无法对齐的问题. 1. 去掉option中的height,完美对齐,但当数据较多的时候,table会自动增加height,显示所有数据而不 ...
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Reques的解决办法
最近更新了一下Android Studio,在导入新项目之后出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 4 ...
- KBEngine简单RPG-Demo源码解析(3)
十四:在世界中投放NPC/MonsterSpace的cell创建完毕之后, 引擎会调用base上的Space实体, 告知已经获得了cell(onGetCell),那么我们确认cell部分创建好了之后就 ...