linux命令行更改文件名:将当前目录下所有子目录下以a开头的.cpp文件改名为以b开头的.c文件

linux下文件改名方式众多,正常情况下几乎所有方式都管用,随便一搜即可,但是遇到如标题这样的特殊一点的,很多方式就不管用了,现归纳两种方法如下:

find ./ -name "a*.cpp" | awk '{head=$0;gsub(/\/a[^\/]*\.cpp$/,"",head);body=$0;gsub(/^\..*\/a/,"/b",body);sub(/\.cpp$/,".c",body);sub(/$/,body,head);origin=$0;$0=head;system("mv "origin" "$0)}'

这种方式使用awk脚本命令,功能强大,几乎什么复杂操作都能放进一个awk命令中完成,其中sub和gsub都是使用正则表达式进行字符串匹配然后替换,前者只替换第一个匹配项,后者实现全局替换。不过awk命令不免有些长。

下面的方法完美贴合此问题域,短小精悍:

 find ./* -name "a*.cpp" -exec rename 's/(.*\/)a([^\/]*)\.cpp$/$1b$2\.c/' {} \;
用find的-exec参数,{}代表文件名,然后调用rename命令通过正则表达式进行文件重命名,\;是结束符。

猜你喜欢

转载自blog.csdn.net/m0_37828249/article/details/79055787