-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathfunction.sh
99 lines (68 loc) · 3.22 KB
/
function.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#######################
# 使用方法:传入一个目录,该脚本会遍历该目录下所有的工程配置文件,把每个工程所引用的类提取出来保存为文件
# 该脚本运行过后才能运行ProjectStatistic.sh脚本
#######################
#切割字符串,获取工程名HFBuild
#a="/Users/hufeng/Documents/HFBackupCode/HFBuild/HFBuild.xcodeproj/project.pbxproj"
function serahProjectName()
{
address=$1;
#要将$address分割开,可以这样:
OLD_IFS="$IFS"
IFS="/"
arr=($address)
IFS="$OLD_IFS"
count=${#arr[@]};
projectName=${arr[$[count-2]]};
IFS=".";
arr=($projectName);
echo ${arr[0]};
return 0;
}
#传入一个工程文件,返回一个最终的类的文件
function searchAllClassFromProject()
{
testFile=$1; #第一参数为文件目录
#sed -n '/.m in Sources /p' $testFile > sourceFile.txt; #找出所有包含指定字符创的行,并存储为文件
sed -n '/Begin PBXBuildFile section/,/End PBXBuildFile section/p' $testFile > PBXBuildFile.txt; #找出指定的一段文本,并存储为文本
#sed -n '/Begin PBXBuildFile section/,/End PBXBuildFile section/p' $testFile | grep -Ev '(^Begin)' > tempClassList.txt;
line_count=`cat PBXBuildFile.txt | wc -l`; #计算文件行数
#echo "line_count=${line_count}";
end_line=$[line_count-1]; #做数字运算
# echo "testFile=${testFile}";
sed -n "2,$[line_count-1]p" PBXBuildFile.txt > tempClassList.txt; #去掉第一行和最后一行
#sed是行匹配,awk是列匹配,此处为提取第3列的内容
awk '{print $3}' tempClassList.txt > realClassList.txt; #提取所有的类和其他文件,此时包含storyboard和xib
#grep ".m" realClassList.txt > hufengReal.txt; #提取出所有的.m文件,差不多是相当于所有的类
grep "\.m" realClassList.txt | grep -v "Tests.m$" | grep -v "Tests.mm$" | grep -v "Test.m$" | grep -v "Test.mm" > classListUsed.txt; #这是双grep实现逻辑与的操作,提取出所有的类,注意文件的位置
fileName=$2;
# echo "fileName=${fileName}";
if [ ! -d $fileName ]; then
mkdir -p $fileName; #-p表示多重目录
else
echo "dir already exsit";
fi
#echo "fileName=${fileName}";
sed "s/\.m\{1,2\}$/ /" classListUsed.txt | sort -u > $fileName/finalClassList.txt; #去掉.m和.mm,只留下类的名称,原理是把.m字符用空格替换掉,同时去重
}
filePath=$1; #文件目录
fileExtension="pbxproj";
#找出指定目录下的所有指定格式的文件,把搜索结果传递给数组
fileArray=($(find $filePath -name "*.${fileExtension}"));
echo ${fileArray[0]}; #取出数组第一个元素
if [ -d "project" ]; then
# mkdir -p $fileName; #-p表示多重目录
rm -r "project";
fi
#遍历所有工程配置文件,把每个工程的类提取出来单独保存成一个文件
for tempName in ${fileArray[*]}; do
echo "tempName=${tempName} start...";
#tempName=${fileArray[4]};
projectName=$(serahProjectName ${tempName}); #获取当前工程名字
# echo "projectName=${projectName}";
fullName="project/${projectName}";
#echo "fullName=${fullName}";
resultFile=$(searchAllClassFromProject ${tempName} ${fullName}); #把每个工程所用到的类输出成一个文件
# echo "resultFile=${resultFile}";
echo "tempName=${tempName} done.";
done