更新:
下面的操作有个问题,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目录名总是会在子文件前面就,可以反向排下序号。或者分两步执行,第一次排除文件夹的名字修改,第二次再运行一次文件夹名字的修改就好了。