知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

Shell中处理带有空格的文件名的小trick

发布时间:2014-09-05 14:46:13作者:知识屋

Shell中处理带有空格的文件名的小trick
 
晚上终于把论坛上那个16本Python书的帖子里的书下载完了,发现有好几本书名前都有一个 [搬书匠#123] 这样格式的前缀,而且有几个文档还莫名其妙的有运行权限,于是我决定写个脚本清理一下,其实是套用一下之前的一个脚本(把1.abc.mp3改成01.mp3以自动排序):
 
#!/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
注意这里的变量调用的时候,一定要写为 "$var",如果手一抖写成 $var 就又是一大堆看起来莫名其妙的错误信息了。上面这个脚本运行一切正常。
 
整个处理过程出现了多次诡异的故障,以至于事实上用的时间比手动修改长多了,不过喜爱编程的同道们都明白,这样的一番折腾实在是一种娱乐,比起一个个改文件名好玩的多。
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜