点击(此处)折叠或打开
- #!/bin/sh
- #
- # Description:
- # if there is a file with name: [1-9].xxx, it will be changed into 0[1-9].xxx
-
- for var in `ls`;
- do
- new=`echo $var | sed "s/^\([1-9]\)\./0\1\./g"`
- if [ $var != $new ];then
- mv $var $new
- fi
- done
之前这个脚本运行很正常,我打算直接把 sed 后面的正则表达式改一改就搞定,结果改了之后刷出来一堆错误信息,说 Can't stat file "xxx", 而 xxx 文件只是正确文件名中的一段,我如梦初醒,原来是文件名中有空格,ls 返回的 list 被 for 错误地逐词识别了,这下囧了,源文件空格满满的啊,难怪 Unix Haters' Handbook 把文件名中有空格的问题批得一无是处。
经过一番 google 总算是找到了答案,一个很巧妙的手法,只是把第六行改成了: ls * | while read var. 这其中的道理学过 Shell 的都看得懂,可是想出来可就不容易了。于是兴冲冲地重写了这个脚本,结果如下:
点击(此处)折叠或打开
- #!/bin/sh
-
- ls * | while read var
- do
- if [ -x "$var" ]; then
- chmod a-x "$var"
- fi
- new=`echo "$var" | sed "s/^\[搬书匠[#0-9]*\]\(.*\)$/\1/g"`
- if [ $var != $new ];then
- mv "$var" "$new"
- fi
- done
整个处理过程出现了多次诡异的故障,以至于事实上用的时间比手动修改长多了,不过喜爱编程的同道们都明白,这样的一番折腾实在是一种娱乐,比起一个个改文件名好玩的多。
相关热门文章
给主人留下些什么吧!~~
评论热议