Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1826691
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: LINUX

2012-10-08 00:23:32

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.

 

一定还有更方便的方法,

如果你遇到过请不吝赐教,谢谢!

 

 

 

阅读(2307) | 评论(7) | 转发(6) |
0

上一篇:oracle dblink应用

下一篇:正则表达式简述

给主人留下些什么吧!~~

personball2012-10-09 10:09:45

rename 泪目

lgfang2012-10-08 14:24:17

如果用的是bash:
for each in *; do name=${each%%.*}; ext=${each#*.}; echo $each ${name^^}.$ext; done

或者

for each in *; do name=${each%%.*}; ext=${each#*.}; echo $each $(echo $name | tr '[a-z]' '[A-Z]').$ext; done

example:

[lgfang@huang update]$ for each in *; do name=${each%%.*}; ext=${each#*.}; echo $each ${name^^}.$ext; done
history.log HISTORY.log
sim.log SIM.log
test.tar.gz TEST.tar.gz