Bash中用正则批量复制重命名文件:替换指定内容+移除末尾下划线
用单次正则完成批量重命名的解决方案
核心命令(Perl版rename)
先确认你的系统安装的是Perl版本的rename(Debian/Ubuntu系默认自带,可通过rename --version验证,输出包含Perl字样即可)。先执行测试命令预览修改结果(不会实际改动文件):
rename -n "s/_N_(.*?)_$/_${theID}_\1/" *.cfc_
确认预览结果符合预期后,去掉-n执行实际重命名:
rename "s/_N_(.*?)_$/_${theID}_\1/" *.cfc_
正则逻辑拆解
这条正则表达式/_N_(.*?)_$/同时锁定了两个需要修改的目标:
_N_:精准匹配文件名中要替换的固定标识(.*?):非贪婪捕获_N_到末尾下划线之间的所有内容(避免误匹配其他位置的下划线)_$:匹配文件名末尾的下划线
替换部分_${theID}_\1同步完成两个修改:
- 用
_${theID}_替换原有的_N_ - 用捕获到的中间内容
\1替代原末尾下划线前的内容,等价于直接移除了末尾的下划线
示例验证
当theID=32时,原文件myFile_N_something.cfc_会被正则处理为:
- 捕获组
\1对应内容是something.cfc - 最终生成文件名
myFile_32_something.cfc,完全符合需求
兼容util-linux版rename的备选方案
如果你的系统是CentOS等使用util-linux版rename(不支持Perl正则),可以用bash参数扩展结合循环实现单次逻辑处理:
export theID=32 for file in *.cfc_; do newfile="${file/_N_/_${theID}_}" # 替换_N_标识 newfile="${newfile%_}" # 移除末尾下划线 mv "$file" "$newfile" done
内容的提问来源于stack exchange,提问作者Gavin Baumanis
相关产品推荐
相关产品推荐

