linux文件批量重命名

更新:
下面的操作有个问题,find的结果是带路径的,rename只会替换找到的第一个字符串,比如

./gen_script/gen_sum.tcl --> ./do_script/do_sum.tcl

如果把这个带路径的文件作为参数给rename,它会视图rename为这样的文件./do_script/gen_sum.tcl
而,do_script目前是还没有创建的。

只是修改目录,如果目录有多个层次,也会有这个问题。所以,这种重命名会使find出来的结果失效的情况就不适合用find结合管道来做。可能最好是写循环,判断没有被替换的了就停下来。

或者是一层一层的替换,有几层目录就运行几次替换命令。

参考:https://blog.csdn.net/shangpusp/article/details/8562638

不同版本的rename的不同用法:https://www.cnblogs.com/hester/p/5615871.html

根据实际的需求,还可以考虑用cp,mv之类的命令替代,cp --parent可以保留目录结果进行复制。

参考:https://www.linuxprobe.com/linux-batch-rename.html

rename 's/old/new/' this.old
rename 's/report/review/' *

rename -v 's/123/124/' *  
status.123 renamed as status.124  
report123.txt renamed as report124.txt 

rename -n 's/old/save/' *  
rename(logger.man-old, logger.man-save)  
rename(lyrics.txt-old, lyrics.txt-save)  
rename(olderfile-, saveerfile-)  
rename(oldfile, savefile)  

可以结合find | xargs -I来达到多目录层次的重命名效果,但是注意目录的重命名要在文件的重命名之后发生,否则如果先把文件夹的名字改了,那么后续的文件就会找不到路径而发生错误。

可以fand之后再排下序,find目录名总是会在子文件前面就,可以反向排下序号。或者分两步执行,第一次排除文件夹的名字修改,第二次再运行一次文件夹名字的修改就好了。

原文地址:https://www.cnblogs.com/reasoner/p/14200459.html