随笔-150  评论-223  文章-30  trackbacks-0
脚本概述
   由于某些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 | aw'{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 [ -"$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
   要注意的是,这儿不能使用%%删除最长匹配的尾部来得到link_name,因为它的模式是.[0-9]*,这可能会错误地匹配了so前的部分,比如libx.1.so.2得到libx,而期望的是libx.1.so
   完整脚本下载:ctlsolink

运行效果
   初始状态
   
   运行ctlsolink创建软链接后
   
   运行ctlsolink删除软链接后
          
posted on 2019-11-05 18:17 春秋十二月 阅读(1761) 评论(0)  编辑 收藏 引用 所属分类: System

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理