目录下文件名大小写转换

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

Comments

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

cocobear: 改了个颜色,怎么样?

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

坚持原创技术分享,您的支持将鼓励我继续创作!