清理IOS项目未使用图片脚本-程序员宅基地

技术标签: python  移动开发  ruby  

项目经过需求的变更,产品迭代,会经过多次的改版,有些以前不再使用的图片不一定能够及时的清理掉,这些无用的图片一方面让项目图片资源的结构更加的复杂,另一方面会导致ipa包的体积变大。

因此我们需要清理不再使用的图片资源,在Android项目中使用Lint可以轻松的完成这个任务,iOS中没有太好的工具,借助网上的资源编写了个Python脚本。

 

安装Silver Searcher来搜索字符串,使用方法和ack,grep相似,而且搜索速度比ack,grep快。使用命令行安装:

//先安装homebrew
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

//再安装Silver Searcher
brew install the_silver_searcher

 

可以使用ag、base命令等

ag "image" './'

os.popen('echo $PATH')

//执行bash命令,可以通过os.popen('echo $PATH').read()读取执行的结果。

需要用到的bash命令是ag "image" './'rm -rf './',后者用来删除文件夹。

 

ignores

可能使用下面的方式来访问图片

for (int i = 1; i <= 10; ++i) {
    NSString *imageName = [NSString stringWithFormat:@"image_%d", i];
    UIImage *image = [UIImage imageNamed:imageName];
    ......
}

因此image_1这样的图片会被脚本给检查为未使用,因此添加了ignores过滤器,包含到此内容中的图片会被忽略掉。

ignores = {r'image_\d+', r'RLineTravelType\d+', r'address_\d+'}

def is_ignore(str):
    for ignore in ignores:
        #print ignore, re.match(ignore, str)
        if re.match(ignore, str):
            return True

    print "False"
    return False

 

完整代码如下unUserImg.py

# -*- coding : utf-8 -*-

import os
import glob
import re


ignores = {r'image_\d+', r'RLineTravelType\d+', r'address_\d+'}

pathI = '/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images'

def find_un_used():
    pics = glob.glob1(pathI, '*.png')
    pics = [pic[:-4].replace('@2x', '') for pic in pics]
    print "pnames: ====================>>>>>>>>>>>>>>>"
    print pics
    print "pnames: <<<<<<<<<<<<<<<===================="

    path = '/adu/WorkSpaceN/QunarRN/car_rn/Car'
    unused_pics = []
    for pic_name in set(pics):
        if is_ignore(pic_name) == False:
            command = 'ag "%s" %s'%(pic_name, path)
              result = os.popen(command).read()
              if result == '':
                  unused_pics.append(pic_name)
                  #os.system('rm -rf %s' % (pic_name))
          
            
    txt_path = 'pics.txt'
    txt = '\n'.join(sorted(unused_pics))
    os.system('echo "%s" > %s'%(txt, txt_path))

    print 'Done!!!!!'


def is_ignore(str):
    for ignore in ignores:
        #print ignore, re.match(ignore, str)
        if re.match(ignore, str):
            return True

    print "False"
    return False


def doRm():
    path = '/adu/WorkSpaceN/QunarRN/car_rn/Car'

    txt_path = 'pics.txt'
    pics = open(txt_path).readlines()

    for pic in pics:
        pic = pic.strip('\n')
          sd_pic = path + pic + '.png'
          hd_pic = path + pic + '@2x.png'
      
          os.system('rm "%s"'%sd_pic)
          os.system('rm "%s"'%hd_pic)

    print 'rn Done!'

if __name__ == '__main__':
    find_un_used()
    #is_ignore('image3')


    
def read_file(path):
    print "read file path:", path
    path = os.path.normpath(path)
    if not os.path.exists(path):
        print("文件路径不存在")
        sys.exit(1)

    img_names = []
     for line in open(path):
         # print line
         # print (line.strip())
         img_names.append((line.strip()))
     # print img_names
     return img_names

#查找hybrid项目中是否有使用未使用的图片
def find_hy_un_used():
    #read file name
    img_names = read_file('/adu/WorkSpaceN/QunarRN/car_rn/Car/pics.txt')
    # print img_names

     path = '/adu/QunarGitlab/yexuxianGit/FECar/hybrid_fe/h5/src'
    unused_pics = []
    for pic_name in set(img_names):
        print pic_name
        command = 'ag "%s" %s'%(pic_name, path)
          result = os.popen(command).read()
          if result == '':
              unused_pics.append(pic_name)

    txt_path = 'hypics.txt'
    txt = '\n'.join(sorted(unused_pics))
    print txt
    os.system('echo "%s" > %s'%(txt, txt_path))
    print "Done ..."

# copy指定文件夹下的文件到新的文件夹中
def sourcecpy():
    srcFilePath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/all_unused_pics.txt'
    img_names = read_file(srcFilePath)
    # print img_names

    srcFolderPath = '/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images/'
    desFolderPath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/unusedFiles/'
    for name in img_names:
        source = srcFolderPath+name
        # print source
        # shutil.copy2(source, desFolderPath)   #第一个参数是文件,第二个参数目录
        targetFile = os.path.join(desFolderPath,  name)
        print targetFile
        open(targetFile, "wb").write(open(source, "rb").read())
    print "Done ..."

#筛选出真正的文件名,@2x等
def findAll():
    srcFilePath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/hypics.txt'
    img_names = read_file(srcFilePath)

    unused_pics = []
    for file in img_names:
        pics = glob.glob1('/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images', file+'*')
        unused_pics.extend(pics)

    txt_path = 'all_unused_pics.txt'
    txt = '\n'.join(sorted(unused_pics))
    os.system('echo "%s" > %s'%(txt, txt_path))

    print 'Done!!!!!'

 

 

直接在命令行执行: #python unUserImg.py 即可

转载于:https://www.cnblogs.com/jinfengboy/p/5865328.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30455661/article/details/98613838

智能推荐

第二章 Vue核心技术_5.1.2vue技术 有-程序员宅基地

文章浏览阅读295次。第二章 Vue核心技术2.1 Vue 入门开发2.1.1 创建工程在本地创建文件夹 D:\StudentProject\WebStudy打开 VS Code ,点击 File > Open Folder , 找到 D:\StudentProject\WebStudy 打开单击 WEBSTUDY 右侧的新建目录图标,创建目录: vue-01-core)]..._5.1.2vue技术 有

python常用库大全文库_Python零基础入门学习22:常用第三方库之wordcloud词云制作...-程序员宅基地

文章浏览阅读113次。注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。本文约2000字,阅读时间约为5分钟。本文介绍如何使用Python制作词云。词云的概念“词云”,就是通过形成“关键词云层”或“关键词渲染”,对网络文本中出现频率较高的“关键词”的视觉上的突出。词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。词云的一个例子如下:词云图的一个例子制作词云前的准备Pyth..._背影词云

Counter() most_common()统计_counter().mostcommon()-程序员宅基地

文章浏览阅读1.9k次。1. 对字符串\列表\元祖\字典进行计数,返回一个字典类型的数据,键是元素,值是元素出现的次数举例:from collections import Counters = "hello-python-hello-world"a = Counter(s)print(a)# 结果 Counter({'-': 3, 'd': 1, 'e': 2, 'h': 3, 'l': 5, 'n': 1, 'o': 4, 'p': 1, 'r': 1, 't': 1, 'w': 1, 'y': 1})2. _counter().mostcommon()

PDMS二次开发应用案例——PipelineTool_维图软件pdms插件-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏34次。Pipeline 是一个以管线 PIPE 和 BRAN 为主要操作对象的小工具,实现了些基本的批处理功能_维图软件pdms插件

android view setbackgroundresource,解决Android加载图片时内存溢出的问题 setBackgroundResource setImageResource...-程序员宅基地

文章浏览阅读1k次。public static Bitmap readBitMap(Context context, int resId){BitmapFactory.Options opt = new BitmapFactory.Options();opt.inPreferredConfig =Bitmap.Config.RGB_565;opt.inPurgeable = true;opt.inInputShar..._android setbackground 内存爆了

数据结构实验报告——排序算法设计及分析(排序单链表)_二、实验目的 1.熟悉并掌握各种排序方法的设计思路。 2.掌握各种具体排序算法在计-程序员宅基地

文章浏览阅读3.4k次。一、实验目的和要求通过学习多种排序算法,体会对同一种操作多种不同的算法设计;通过比较各排序算法对于数据存储结构的要求,体会算法设计不依赖于数据存储结构,而算法实现依赖于数据存储结构:通过分析排序算法的效率,研究如何进一步提高算法性能的方法。要求掌握每种排序算法思路、算法描述、算法设计 与算法实现手段,掌握排序算法时间复杂度和空间复杂度的分析方法,具有排序算法的设计能力。二、实验题目实验一:由单链表构造排序单链表public SortedSinglyList(SinglyList<_二、实验目的 1.熟悉并掌握各种排序方法的设计思路。 2.掌握各种具体排序算法在计

随便推点

PreparedStatement解决SQL注入、SQL语句批量执行以及如何获取自增主键的值_批量获取自增主键怎么解决-程序员宅基地

文章浏览阅读494次。PreparedStatement的使用什么是SQL注入?即本来应该是值的位置,添加进去了SQL语句例:——注入的内容:or ‘1’=’1’如何处理?使用PreparedStatement,将编译期改为预编译好处:由于创建对象时已经将SQL语句逻辑部分编译完成,所以不会被用户的输入内容所影响,从而解决SQL注入的问题与statement相比的优势?——编译时将SQL语句的逻辑锁死好处:代码结构整洁,不易出错,可以避免SQL注入什么时候使用?当SQL语句中有变量时使用Prep_批量获取自增主键怎么解决

MPC5634的eTPU模块学习笔记(一)_mpc57的etpu-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏20次。关于MPC5634的eTPU的学习笔记_mpc57的etpu

esri/config类-程序员宅基地

文章浏览阅读1.8k次。define("esri/config", ["dojo/_base/config","dojo/topic","dojo/has","esri/kernel"], function(_base_config, dojo_topic, dojo_has, esri_kernel) { var esriConfig = { defa_esri/config

【keras】GoogleNet 网络结构及其实现_keras.model googlenet-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏20次。深度学习模型常常通过增加模型的深度或者宽度来获得更高的性能。本文将就深度学习常见的网络结构进行介绍。GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。在介绍GoogLeNet之前,先介绍一下两种..._keras.model googlenet

linux 查看双机运行,RHCS(Linux 双机)的常用操作-程序员宅基地

文章浏览阅读620次。RHCS(Linux 双机)的常用操作:1 启动双机软件服务在webdb1 和webdb2 上操作在webdb1 上用root 用户登录进入图形界面,点击桌面右键open terminal输入如下命令:1) service cman start (在webdb1 上执行)2) service cman start (在webdb2 上执行)以上两命令可以同时执行等执行完成后,继续3) servic..._linux查看双机状态

特效弹出层提示php,jquery制作漂亮的弹出层提示消息特效-程序员宅基地

文章浏览阅读90次。今天给大家带来一款基于jquery超炫的弹出层提示消息。这款实例页面初始时,一个go按钮。当单击go按钮时,提示强出层以动画形式出现。效果图如下:实现的代码。html代码:GOSuccessCheck your email for a booking confirmation. We'll see you soon!OK$('#go').click(function () {go(50);});..._php好看的提示框

推荐文章

热门文章

相关标签