Linux下如何批量建立文件软连接(极简版)

上一篇里面是通过创建了Shell脚本文件的方式来批量创建文件的软链接,由于Shell脚本处在(Linux)菜鸟阶段,那个脚本文件的编写完全是现学现卖——Shell语法都没看完,这我会告诉你吗,告诉你会信吗?所以引出的一个问题是:此脚本虽然能正确处理任务但肯定还有很多地方的处理值得商榷。为此也花了一些时间思考了一下如何不要使用shell脚本文件来处理批量建立软链接的问题,后来确有一些思路,在上篇成文之时已经有了一些方法,所以当时卖了一个关子。

要一行脚本代码来建立批量的文件软链,Mitchell的思路主要在通道的使用上,我希望能够这样:

## 代码是示意,并不能正常运行
ls /tmp/*.log | ln -s .....

但在下这个通道我并没有知道合适的传递参数的方法。只能告一个段落。换种思路,就是将文件列表用for循环来处理。于是,有了下面的脚本:

## 获取目录下要软链接的文件,让后用for遍历文件来创建软链接。
FILES=`ls *.log`;for FILE in $FILES;do ln -s '/tmp/'$FILE '/tmp/lnk_'$FILE;done

但这个只能放到目标目录下,这是/tmp目录,然后运行,因为FILE遍历出来不能含有路径。为了改善这个缺点,做了改进:

## 使用basename来将路径过滤掉,只取文件名称
FILES=`ls /tmp/*.log`;for FILE in $FILES;do ln -s $FILE '/tmp/lnk_'`basename $FILE`;done

后来发现,此处还可以继续改进,在Linux下你可以这样:

## create all files' soft link in '/tmp/' which subfix is log, and all link files' save to /tmp/ with prefix 'lnk_'
for FILE in /tmp/*.log;do ln -s $FILE '/tmp/lnk_'`basename $FILE`;done

 这样就可以在任意位置下运行这个代码,只要修改目标路径和存放链接的路径即可。

 很酷吧,这样就可以实现上一篇的那么东西。来吧,看看更酷的,回到前面的通道,我们虽然没有办法直接将数据直接传递给ln,但是我们可以这样

## Create a batch of soft-link files with pipeline
ls /tmp/*.log | xargs -L 1 -i sh -c "ln -s {} '/tmp/lnk_'\$(basename {})"

 哇噢~ 原来通道也可以这么来做,当然,Mitchell对Linux的命令还不是很了解,但我相信肯定可以在这个基础上,再精简出更酷的代码的。

恩,看了上面两种方法,是不是瞬间觉得好有难度——恭喜,Same as me。搞这个软链接,需要这么消耗脑细胞吗。记得原来的cp好像有个参数是创建连接的,于是,翻看了cp的命令帮助,加之网络搜索大神附身,不多久,出来了cp版:

## create a batch of soft-link files with cp command.
## this command can not create soft-link file with prefix or subfix
## so it can not create soft-link file at same directory.
cp -rs /tmp/*.log /tmp/lnk/

这个版本太简单了吧,和前面的比,这个命令无法在同目录下创建软链接,但应该没有人有这么奇怪的需求——除了我测试之外。

写到这里,震惊了么,至少我是这样的,从开始写文件,到这里,这个工作量差距不是一点两点。如果你还没有震惊,那么你看看这个:

## create a batch of soft-link files with ln command
## similar to cp -rs
ln -s /tmp/*.log /tmp/lnk/

这... 看到可以这样用的时候,我无语了,原来ln自己就可以做批量创建啊!内心有无数只,无数只,无数只[哔哔哔]奔过啊。

到这里,终于被我自己的努力证的了一个完美的循环,有句话果然毁人不倦:从哪里来,到哪里去!

 

Wednesday, May 21, 2014 | Unix & Linux

文章评论

  • # re: Linux下如何批量建立文件软连接(极简版)
    感谢,楼主大大的研究精神
  • # re: Linux下如何批量建立文件软连接(极简版)
    对你有帮助就好。
    我比较菜,路总能被自己从直的走成弯的。:P
  • # re: Linux下如何批量建立文件软连接(极简版)
    • isme
    • 1/12/2016 9:49 PM
    ln -s /tmp/*.log /tmp/lnk/
    这个应该是bash帮助完成的吧,将*.log 替换成实际的匹配文件
  • # re: Linux下如何批量建立文件软连接(极简版)
    @lsme:
    应该不是了,虽然具体ln的实现细节不太清楚,但ln是个二进制文件。可以用来实现的方法应该很多吧。

发表评论

Please add 6 and 8 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,常年游弋于电子商务,属于互联网行业分类中的杂牌军。当前正在待业中...