Linux下如何用Shell脚本批量创建文件软链接

这篇是个人Shell脚本的初作,功能是批量创建文件的软链接。文中值得商榷之处肯定非常多,欢迎大家指点。
—— MitchellChu

最近在,具体说是CentOS (v 6)下,因为自定义安装的软件太多,而自定义安装之后,由于系统的PATH中没有安装软件的路径,每次都需要将安装后的软件可执行文件在PATH里面有的bin目录下创建软链接,以此来达到直接可以调用的目的。一个文件两个文件也许还好,可有的软件需要弄出个一大堆的文件要软链接,在Shell下一个一个命令的敲,确实不是一个事情。也正因此,才有了此篇博文——Linux下用Shell脚本来批量创建文件的软链接。

要批量创建文件的软链接,自然要想想下我的脚本应该是能够提供什么样功能的(需求):由于初期没有什么特别要求,只要批量创建软链接即可,但创建软链接是使用ln -s target_file link_file的格式来的,所以,1. shell脚本要可以接收到这两个关键因素!2.如果仅仅是接受这两个参数,就没有批量创建软链接一说了,因此,还应该有个文件过滤器,能够将需要批量创建的文件筛选出来。

需求明确成:shell脚本能够过滤出需要创建软链接的文件,并通过ln命令在目标目录中

根据这个需求,捣鼓了一下,弄出了BatchLinkFilesCreater.sh:

#!/bin/sh
########################
## ARGUMENTS:
## TARGET_DIR: the directory where the link file to link.
## FILES_FILTER: this is the arguments of the ls command.
## LINK_DIR: where is the link file to save.
########################
function usagehelp()
{
        echo -e "Usage:batchCreateLink.sh -t TARGET_DIR -f FILES-FILTER -l LINK-DIR\n\n
                TARGET_DIR: the directory where the link file to link\n\n
                FILES_FILTER: arguments of ls command, to filter the list files.\n\n
                LINK_DIR: where is the link file to save.\n\n\n
                sample:./batchCreateLink.sh -t \"/usr/local/bin/\" -f \"*\" -l \"/tmp/\"\n
                any problems please contact MitchellChu, http://blog.useasp.net/"
}

if [ $# != 6 ]
then
        usagehelp
        exit 1
fi

echo "======================================="
echo "Multiple link files Creater"
echo -e "version:0.0.0.1\n"
echo "ARGUMENTS:"

while getopts "t:f:l:" arg
do
        case $arg in
                t)
                        echo "->TARGET_DIR:$OPTARG"
                        TARGET_DIR=`dirname $OPTARG"/*"`;;
                f)
                        echo "->FILES_FILTER:$OPTARG"
                        FILES_FILTER=$OPTARG
                        ;;
                l)
                        echo "->LINK_DIR:$OPTARG"
                        LINK_DIR=`dirname $OPTARG"/*"`;;
                ?)
                        usagehelp
                        exit 1;;
        esac
done

echo "======================================="

cd $TARGET_DIR
if [ `pwd` != $TARGET_DIR ]
then
        echo "$TARGET_DIR is not exist."
        exit 1
fi

cd $LINK_DIR
if [ `pwd` != $LINK_DIR ]
then
        echo "LINK DIR:$LINK_DIR is not exist."
        exit 1
fi

cd $TARGET_DIR
echo -e "\n"
for FILENAME in $FILES_FILTER
do
        if [ $FILENAME ]
        then
                echo -e $LINK_DIR"/"$FILENAME" ----> "$TARGET_DIR"/"$FILENAME
                ln -s $TARGET_DIR"/"$FILENAME $LINK_DIR"/"$FILENAME
        fi
done
echo -e "\n\n[DONE]"

 这个脚本文件做的事情很简单:根据用户输入的目标文件夹,连接存放的文件夹和文件过滤参数,自动完成在目标文件夹中根据文件过滤规则过滤出需要创建软链接的文件,然后在需要软链接的存放文件夹内创建每一个文件的软链接,链接文件的目标自然是对应的目标文件夹内的文件。

为了能够更健壮点,添加了一些校验脚本,上面的脚本可保存到任意目录下,同时赋予可执行权限:

chmod +x BatchLinkFilesCreater.sh
## 如果仅仅是自己使用,则可以
chmod u+x BatchLinkFilesCreater.sh

在有执行权限后,你就可以根据你的需要调用这个shell脚本来批量创建了。

BatchLinkFilesCreater.sh脚本的参数说明:
-t TARGET_DIR,目标文件夹,就是要创建软连接的目标文件所在文件夹
-f FILES_FILTER,此参数是-t指定的文件夹内的文件过滤参数,根据此参数指定的过滤规则筛选出要创建软链接的文件。
-l LINK_DIR,被创建的软链接存放的文件夹。

文件功能:在LINK_DIR内创建TARGET_DIR内用FILES_FILTER筛选出来的文件的软连接。

如:

## 在/tmp目录下创建/tmp下所有以[.log]结尾的文件的软连接。
## 必要的时候你可能需要sudo来获得权限
./BatchLinkFilesCreater.sh -t "/tmp/" -f "*.log" -l "/tmp/"

 当然,这是测试,要删除测试文件,请使用find命令:

## 删除上面代码创建在/tmp目录下的以.log结尾的软链接.
find /tmp/ -maxdepth 1 -type l -name "*.log" -exec rm -f {} \;

OK,目标任务基本完成,有了这个shell脚本,批量创建软链接是完全没有问题的。如果你愿意,可以将脚本改成任何其他需要批量处理的脚本代码——TIPs:仅需要很少的修改。包括但不限于:

  1. 批量文件备份
  2. 批量文件改名

试试,看还能怎么用?我也在思考中ing...

哼,哼,嗯哼……那个,其实要实现批量建立文件的软链接并不需要这么复杂的Shell脚本处理哦,一行命令就可以,真的,一行命令!怎么做?卖个关子,请参看后继博文吧~~

Wednesday, May 21, 2014 | Unix & Linux

文章评论

No comments posted yet.

发表评论

Please add 3 and 3 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。