 | 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.
| |