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

Shell命令
1148
linux
linux 举报
2020-05-15

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

 

首先不能写脚本,那样的话还要教他用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.

 

一定还有更方便的方法,

倒序看帖 只看楼主
热点关注
postfix下过滤垃圾邮件的有效方法
shell脚本每行后面多了一个^M的原因和解决办法
定时检测服务,检测down掉后重启。系统检测到DMSERVER运行正常
挂载磁盘的时候遇到一个问题,挂载完磁盘之后重启服务器挂载的盘丢失了.
中标麒麟系统Your trial is EXPIRED and no VALID licens
termux 开启ssh并用用户名和密码登陆
组成共享库的目标文件和一般的目标文件有所不同,在编译时要加-fPIC和-share选项,例如:
gcc指定链接库路径后还是找不到库文件
./configure -build,-host,-target设置
关于Linux系统中configure中build,target,host中的若干问题
不用单独编译gmp、mpfr和mpc三个包,放在gcc源码下面一起编译
安装最新版本的GCC编译器(./configure执行编译报错 C++ compiler too old)
在后台用进程名运行bash脚本
shell参数判断
postfix过滤规则的几个关键规则