日常开发中的脚本

日常开发中写的脚本

一直想抽时间学习一下shell编程,一直给自己找借口,万事开头难写的第一个日常工作用到的脚本。

1.杀掉端口的所有进程

#!/bin/sh
if [ $# -lt 1 ]; then
    echo "need 1 argument!"
    exit 0
fi
for info in "$(sudo lsof -i tcp:$1)"
do
    index=0
    for element in ${info}   
    do  
        let index=index+1
        if [ $index -eq 11 ]; then
            echo "$(sudo kill -9 $element)"
            break
        fi
    done 
done

使用例子:

./kill_port.sh 8081

2.合并当前目录下模拟器,真机的静态库

#!/bin/sh
if [ $# -lt 3 ]; then
    echo "need 3 arguments!"
    exit 0
fi

lipo -create $1 $2 -output $3
lipo -info $3

使用

./lib_merge.sh xxx1.a xxx2.a xxx.a

3.扫描图片size大于限制size的图片

#!/bin/sh
if [ $# -lt 1 ]; then
    echo "请输入限制图片大小"
    exit 0
fi

find . -type f -size +$1k -name *.png > result.txt
open ./result.txt

使用 限制size 70k

./filter_large_size_images.sh 70

4.扫描项目中未使用的图片资源(支持RN)

# -*- coding: utf-8 *-

import os
import os.path
import copy
import datetime
import time
import sys
import ConfigParser

import re

def cur_file_dir():
     #获取脚本路径
     path = sys.path[0]
     #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
     if os.path.isdir(path):
         return path
     elif os.path.isfile(path):
         return os.path.dirname(path)


def get_file_lists(rootdir, resource_pattern, applyFliter):   # 获取文件列表
    file_lists = []
    sum = 0
    for parent,dirnames,filenames in os.walk(rootdir):    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字

        for filename in filenames:                        #输出文件信息
            fullpath = os.path.join(parent,filename)
            if (applyFliter):
                if ('.framework' in fullpath) or ('react_native' in fullpath) or ('Pods' in fullpath):
                    continue
            ext = filename.split('.')[-1]

            filename = filename.split('.')[0]
            if '@' in filename:
                filename = filename.split('@')[0]

            if ' '+ ext +' ' in resource_pattern:
                file_lists.append([filename, fullpath, 0]) # 0 用于标记资源是否被使用的状态,后面会使用

    return file_lists




def process_resources(resource_lists): # 去除第三方库的资源

    new_resource_lists = []

    for resource_list in resource_lists:
        path = resource_list[1]
        #print path
        if (not '.framework' in path) and (not 'react_native' in path) and (not 'Pods' in path):
            #print path
            new_resource_lists.append(resource_list)

    return new_resource_lists

def rn_process_resource(rn_resource_lists): # 去除RN中的基础库

    rn_new_resource_lists = []
    for rn_resource_list in rn_resource_lists:
        path = rn_resource_list[1]
        if (not 'node_modules' in path):
            rn_new_resource_lists.append(rn_resource_list)

    return rn_new_resource_lists

def get_unused_resources(resource_lists, code_lists):   #检查未使用的资源

    unused_resource_lists = []

    for code_list in code_lists:
        filePath = code_list[1]
        if os.path.exists(filePath) == False:
            continue;
        fileObj = open(filePath, 'r')  
        lines = fileObj.read()
        
        for index, resource_list in enumerate(resource_lists):
            resource = resource_list[0]
            if resource in lines:
                resource_lists[index] = [resource_list[0], resource_lists[1], 1]

        fileObj.close()


    for resource_list in resource_lists:
        if resource_list[2] == 0:
            unused_resource_lists.append(resource_list)

    return unused_resource_lists




def check_package_info(resource_lists, proj_file, pod_file): #检查资源是否被打包
    
    unused_resource_list = []

    fileObj1 = open(proj_file, 'r')  
    lines1 = fileObj1.read()
    fileObj2 = open(pod_file, 'r')  
    lines2 = fileObj2.read()

    for resource_list in resource_lists:

        resource = resource_list[0]

        if  resource in lines1 or resource in lines2:
            #print resource
            unused_resource_list.append(resource_list)
        # else:
        #     print '%s is not packaged' % resource
    
    return unused_resource_list



def Print_to_file(file_lists,LogFile):    # 打印到日志文件
    print LogFile
    fileObj = open(LogFile, 'w') 
    print >> fileObj, "The unused resource lists: " 

    for file_list in file_lists:
        print >> fileObj, file_list[1]
    
    fileObj.close()


if __name__=="__main__":

    currenttime=datetime.datetime.now().strftime('%Y-%m-%d_%H.%M.%S')
    LogPath=cur_file_dir()+'/Logs/UnusedResources-' + currenttime

    if not os.path.exists(LogPath):
        os.makedirs(LogPath)
    UnusedResource_Log=LogPath+"/native_ununsed.txt"
    RN_UnusedResource_Log=LogPath+"/rn_unused.txt"

    

    match_resource_pattern=' png jpg ' #前后必须有一个空格  待检查的资源文件类型
    match_code_pattern=' h m xib mm plist ' #前后必须有一个空格 
    rn_match_code_pattern=' js '


    #### 设置参量
    ProjPath=cur_file_dir()
    ProjectName='XX' # 自己定定义projectName
    xcodeprojPath=cur_file_dir()+'/' + ProjectName + '/' + ProjectName + '.xcodeproj/project.pbxproj'
    PodsprojPath=cur_file_dir()+'/' + ProjectName + '/Pods/Pods.xcodeproj/project.pbxproj'
    RNPath=cur_file_dir()+'/react_native'

    # 获得资源文件列表
    print '获得Native资源文件列表...'
    resource_lists = get_file_lists(ProjPath, match_resource_pattern,True)
    resource_lists = process_resources(resource_lists)

    # 获得代码文件列表
    print '获得Native代码文件列表...'
    code_lists = get_file_lists(ProjPath,match_code_pattern,True)

    # 检查资源是否被工程所使用
    print '检查Native资源是否被工程所使用...'
    unused_resource_list = get_unused_resources(resource_lists, code_lists)

    # 检查未被使用的资源是否被打包
    print '检查Native未被使用的资源是否被打包...'
    unused_package_resource_list = check_package_info(unused_resource_list, xcodeprojPath, PodsprojPath)

    # 打印到日志
    print '打印Native未被使用的资源到日志...'
    Print_to_file(unused_package_resource_list, UnusedResource_Log)

    ######################################### RN ############################################
    # 获取RN资源文件列表
    print '获得RN资源文件列表...'
    rn_resource_lists = get_file_lists(RNPath, match_resource_pattern,False)
    rn_resource_lists = rn_process_resource(rn_resource_lists)

    # 获取RN代码文件列表
    print '获得RN代码文件列表...'
    rn_code_lists = get_file_lists(RNPath,rn_match_code_pattern,False)

    #检查RN资源是否被工程所使用
    print '检查RN资源是否被工程所使用...'
    rn_unused_resource_list = get_unused_resources(rn_resource_lists, rn_code_lists)

    # 打印到日志
    print '打印RN未被使用的资源到日志...'
    Print_to_file(rn_unused_resource_list, RN_UnusedResource_Log)
  • 1.ProjectName='XXX' 指定项目名
  • 2.cd 到项目根目录下执行python check_all_rn_interfaces.py即可,结果在根目录Logs文件中。

5.扫描项目中所有的RN Module以及接口属性

# -*- coding: utf-8 *-

import os
import os.path
import copy
import datetime
import time
import sys
import ConfigParser

import re

def cur_file_dir():
     #获取脚本路径
     path = sys.path[0]
     #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
     if os.path.isdir(path):
         return path
     elif os.path.isfile(path):
         return os.path.dirname(path)


def get_file_lists(rootdir, resource_pattern):   # 获取文件列表
    file_lists = []
    for parent,dirnames,filenames in os.walk(rootdir):    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字

        for filename in filenames:                        #输出文件信息
            fullpath = os.path.join(parent,filename)
            if ('react-native' in fullpath) or ('Pods' in fullpath) or ('Example' in fullpath):
                continue
            ext = filename.split('.')[-1]

            filename = filename.split('.')[0]
            if '@' in filename:
                filename = filename.split('@')[0]

            if ' '+ ext +' ' in resource_pattern:
                file_lists.append([filename, fullpath, 0]) # 0 用于标记资源是否被使用的状态,后面会使用

    return file_lists


def check_package_info(resource_lists, proj_file, pod_file): #检查资源是否被打包
    
    used_resource_list = []

    fileObj1 = open(proj_file, 'r')  
    lines1 = fileObj1.read()
    fileObj2 = open(pod_file, 'r')  
    lines2 = fileObj2.read()

    for resource_list in resource_lists:
        resource = resource_list[0]
        if  resource in lines1 or resource in lines2:
            used_resource_list.append(resource_list)
    
    return used_resource_list

def filter_all_include_rn_interface_list(resource_lists, include_module_keyWords,include_interface_keyWords,export_interface_keyWords):
    all_include_rn_interface_list = []

    for resource_list in resource_lists:

        fullpath = resource_list[1]
        fileObj = open(fullpath, 'r')
        lines = fileObj.read()

        for module_keyword in include_module_keyWords:
            if module_keyword in lines: ### module存在
                insert_file = []
                insert_file.append(fullpath)

                find_current_index = 0
                while find_current_index < len(lines):
                    find_item_start = -1
                    find_item_keyWord = ''
                    for interface_keyWord in include_interface_keyWords:
                        temp_find_item_start = lines.find(interface_keyWord,find_current_index)
                        if temp_find_item_start != -1: ### 找到关键字的起始位置
                            if find_item_start == -1:
                                find_item_start = temp_find_item_start
                                find_item_keyWord = interface_keyWord
                            elif temp_find_item_start < find_item_start:
                                find_item_start = temp_find_item_start
                                find_item_keyWord = interface_keyWord

                    if find_item_start == -1: ### 如果找不到直接退出
                        break;

                    if find_item_keyWord in export_interface_keyWords:
                        find_item_end = lines.find(')',find_item_start + 1) ### 部分关键字的调用没有'{}'
                        find_item_end = find_item_end + 1;
                    else:
                        find_item_end = lines.find('{',find_item_start + 1)
                        find_item_end = find_item_end - 1

                    if find_item_end != -1:
                        insert_string = lines[find_item_start:find_item_end - 1]
                        
                        if '@' not in insert_string:
                            insert_file.append('           ' + lines[find_item_start:find_item_end])
                       
                    find_current_index = find_item_end + 1  

                all_include_rn_interface_list.append(insert_file)  
                break

    return all_include_rn_interface_list 
        
def Print_to_file(file_lists,LogFile):    # 打印到日志文件
    print LogFile
    fileObj = open(LogFile, 'w') 
    print >> fileObj, "result lists: " 

    for file_list in file_lists:
        for item in file_list:
            print >> fileObj, item
        print  >> fileObj,'\n'
        print  >> fileObj,'\n' 
    
    fileObj.close()




if __name__=="__main__":

    currenttime=datetime.datetime.now().strftime('%Y-%m-%d_%H.%M.%S')
    LogPath=cur_file_dir()+'/all_used_rn_interfaces_' + currenttime
    ProjectName='XXX' # 自己定定义projectName

    if not os.path.exists(LogPath):
        os.makedirs(LogPath)
    resultPath=LogPath+"/result.txt"

    match_code_pattern=' m mm ' #前后必须有一个空格 
    filter_module_keyWords = ['RCT_EXPORT_MODULE']
    filter_interface_keyWords = ['RCT_CUSTOM_VIEW_PROPERTY','RCT_EXPORT_METHOD','RCT_EXPORT_VIEW_PROPERTY','RCT_REMAP_VIEW_PROPERTY']
    filter_export_interface_keyWords = ['RCT_EXPORT_VIEW_PROPERTY','RCT_REMAP_VIEW_PROPERTY']

    #### 设置参量
    ProjPath=cur_file_dir()
    xcodeprojPath=cur_file_dir()+'/' + ProjectName + '/' + ProjectName +'.xcodeproj/project.pbxproj'
    PodsprojPath=cur_file_dir()+'/' + ProjectName + '/Pods/Pods.xcodeproj/project.pbxproj'

     # 获得代码文件列表
    print '获得Native代码文件列表...'
    code_lists = get_file_lists(ProjPath,match_code_pattern)

    # 过滤掉项目中未使用的类
    print '过滤掉项目中未使用的类...'
    code_lists = check_package_info(code_lists, xcodeprojPath, PodsprojPath)

    # 过滤含有RN接口或属性的类
    print '过滤含有RN接口或属性的类...'
    code_lists = filter_all_include_rn_interface_list(code_lists, filter_module_keyWords,filter_interface_keyWords,filter_export_interface_keyWords)


    Print_to_file(code_lists, resultPath)
   

使用:

  • 1.ProjectName='XXX' 指定项目名
  • 2.cd 到项目根目录下执行python unused_resource_check.py即可,结果在根目录all_used_rn_interfaces开头的文件中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容