灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2843回复:0

Linux中批量把文件名大小写转换

楼主#
更多 发布于:2012-10-11 14:51
Linux中批量把文件名大小写转换



一哥们从现场打来急电说现在有一个目录,

目录下有上千个文件,现在需要把文件名由小写全部转化为大写。



首先不能写脚本,那样的话还要教他用vi,  改权限,只能用命令了。

字符转换嘛,当然想到的是 tr :  



for file in * ;

do mv  $file `echo $file |  tr 'a-z' 'A-Z'`;

done



过了一会儿这哥们又打电话说,扩展名不要改为大写的,保留为小写就行了。

这样明显分段的事情当然要交给 awk 了:
 

for file in *;

do mv $file `echo $file | awk -F . '{print toupper($1)"."$2}' `;

done



这样是可以把类似 a.txt 的文件修改了,但有多个扩展名的就没招了,比如 b.tar.gz,

还好 awk 支持变量:    

for file in *;

do mv $file `echo $file |

awk -F . ' {

                      for (i = 1; i <= NF;i++)

                                 if (i == 1)

                                       result = toupper($i);

                                else

                                      result += "."$i;

                        print $result;

              }' `;

done

但结果是错的,一个文件名也没有改变,

查了下说gawk才支持toupper, tolower,

换成gawk 还是不对。



最后没办法只好找个折衷的方法,先全部转化为大写,然后再将扩展名转回小写:

for file in *;    

do mv $file `echo $file |

        sed -e s/.TXT/.txt/g  `;

done

但是.并没有被转义成., 而依然是代表任意字符,

这样的话如果basename中含有扩展名就悲剧了。
 

试了几下发现这样才是转义的:

            sed -e s/[.]TXT/.txt/g  `;

ok.

喜欢0 评分0
游客

返回顶部