有时候,需要修改某个文件夹内的所有某个扩展名的文件的文件名,比如大小写互转。那么我们就需要获取所有的相关文件名,然后进行重命名。获取相关文件名的绝对路径名可以用find命令,而修改文件名则使用mv命令,至于循环的处理,则只能使用awk这种程序语言来进行处理。
例子:当前文件夹下,所有以.PCM为扩展名的文件都是大写,我们要把它们都转为小写。命令为:
$ find $PWD -regex .*PCM | awk -f ../rename.awk.txt
1. $PWD为当前文件夹,是bash的获取变量的方法。 -regex表示正则表达式匹配文件名。
2. rename.awk.txt的内容如下:
$0 ~/PCM$/{oldpath = $0; strnum = split($0, myarray, "/");myarray[strnum] = tolower(myarray[strnum]);newpath = ""; for (i=1;i<=strnum;i++){if (myarray[i] != ""){newpath = newpath "/" myarray[i]}}; cmd = "mv " oldpath " " newpath; system(cmd);}
- $0表示输入行,即文件的绝对路径名。$0 ~ /PCM$/表示绝对路径名的末尾是PCM的情况下,执行以下操作。
- oldpath变量记录原始的文件名。
- split函数对原始文件绝对路径进行分割,放到数组myarray中,并且返回数组元素的数量到strnum。该操作是为了获得文件名,为了后边大写变小写。
- tolower()函数将字符串的所有大写字母变为小写;toupper()刚好相反。
- 通过for循环,生成新的文件绝对路径。注意,awk的字符串链接很简单,直接串,连加号都不用。
- 使用mv命令来实现重命名。