可可熊的窝

目录下文件名大小写转换

IN:Shell, 编程相关       Comments:3

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”不是目录。

11-04
2007

3 Comments for 目录下文件名大小写转换

Leave a Comment

loading...