2007年11月04日

for f in *;do
mv $f `echo $f |tr “[A-Z]” “[a-z]“`
done

上面这个脚本可以处理大多数情况,但是当文件名中有空格时该脚本就无效了。

经过尝试下面这段脚本可以解决上面的问题:

[cocobear@cocobear 1027]$ cat re.sh
mv “$1″ “`echo $1 | tr ‘[A-Z]‘ ‘[a-z]‘`”
[cocobear@cocobear 1027]$ find ./ -type f -exec ./re.sh ‘{}’ \;

再想一想其实最前面的代码也一样能解决问题,也是需要在mv的两个参数的变量名上加上双引号:

for f in *;do
mv “$f” “`echo $f |tr “[A-Z]” “[a-z]“`”
done

我刚开始改的时候只对`echo $f | tr “[A-Z]” “[a-z]“`用了双引号,结果出现下面的错误:

mv: 目标 “dscn6208 [1600x1200].jpg” 不是目录

解释:
shell传递参数默认是按照空格来区分的,因此当文件名里有空格时传递参数的过程中就会被认为是传递了两个参数,这样如果$f没有使用双引号的话”dscn6208 [1600x1200].jpg”就会被认为两个文件,相当于:
mv dscn6208 [1600x1200].jpg “dscn6208 [1600x1200].jpg”
mv会认为第三个参数是文件夹,所以会提示目标“dscn6208 [1600x1200].jpg”不是目录。

3 楼了已经

  • wind写于07年11月05日

    写得很清楚,就是代码用的颜色太难色看了,还不如用普通的红色。

  • cocobear写于07年11月05日

    改了个颜色,怎么样?

  • luguo写于07年11月05日

    恩,总结得好。
    网上其它那些处理文件名空格的方法就显得过于复杂了~~

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« 一些杂事
» 几种简单的排序实现