由于某些sdk或軟件依賴眾多的第三方庫,而從官網下載到windows主機或從linux傳到windows時,所依賴的so庫往往丟失符號鏈接,給編譯運行帶來不便,因此編寫了ctlsolink腳本,用于自動為單個so或某目錄下的眾多so或創建/刪除一級/二級符號鏈接。該腳本的用法如下:
● 第1參數為mk或rm子命令,mk表示創建,rm表示刪除
● 第2參數為文件或目錄
● 第3參數是可選的-r,且只能是-r,如果指定了,則表示不斷遞歸子目錄
腳本實現
考慮到so庫帶版本一般多為libx.so.1,libx.so.1.2,libx.so.1.2.3這三種形式(x為庫名),對于前一種創建/刪除一級符號鏈接即可,后兩種則創建/刪除二級符號鏈接。為了精確地抽出一級和二級鏈接名稱,這里使用awk來匹配,用shell變量的最短匹配模式從尾部逐步刪除點號及數字,核心代碼如下
1
if [ "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then
2
if echo $name | awk '{if($0~/\.so\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}$/) exit 0; else exit 1}'; then
3
link_name=${name%.[0-9]*}
4
link_name=${link_name%.[0-9]*}
5
link_name=${link_name%.[0-9]*}
6
link_name2=${name%.[0-9]*}
7
link_name2=${link_name2%.[0-9]*}
8
elif echo $name | awk '{if($0~/\.so\.[0-9]{1,}\.[0-9]{1,}$/) exit 0; else exit 1}'; then
9
link_name=${name%.[0-9]*}
10
link_name=${link_name%.[0-9]*}
11
link_name2=${name%.[0-9]*}
12
elif echo $name | awk '{if($0~/\.so\.[0-9]{1,}$/) exit 0; else exit 1}'; then
13
link_name=${name%.[0-9]*}
14
else
15
return
16
fi
17
18
if [ $do_mk = "yes" ]; then
19
#echo "name=$name, link_name=$link_name, link_name2=$link_name2"
20
if [ -n "$link_name2" ]; then
21
ln -sf $name $link_name2
22
ln -sf $link_name2 $link_name
23
else
24
ln -sf $name $link_name
25
fi
26
else
27
if [ -n $link_name2 ]; then
28
rm -f $link_name2
29
fi
30
rm -f $link_name
31
fi
32
fi

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

完整腳本下載:ctlsolink
運行效果
初始狀態

運行ctlsolink創建軟鏈接后

運行ctlsolink刪除軟鏈接后
