使用Bash脚本删除文件名多余信息的实现方法求助
Bash批量重命名文件名解决方案
根据你的文件名规则(核心名称位于最后一个下划线之后,后缀之前若有-数字后缀需删除),提供两种可直接使用的实现方案:
方案1:使用Perl版rename(简洁高效)
大部分Linux发行版、macOS(可通过brew install rename安装)均默认携带该工具,直接执行正则匹配批量重命名:
- 先执行测试命令,仅打印修改结果不会实际改名,确认匹配正确:
rename -n 's/.*_([^_-]+)(?:-\d+)?\.cpp/$1.cpp/' *.cpp
- 确认输出符合预期后,去掉
-n参数执行实际重命名:
rename 's/.*_([^_-]+)(?:-\d+)?\.cpp/$1.cpp/' *.cpp
正则说明:
.*_:匹配从文件名开头到最后一个下划线的全部内容([^_-]+):捕获核心文件名,匹配所有不包含下划线、横杠的字符(?:-\d+)?:匹配可选的-数字后缀,非捕获组不参与结果替换\.cpp:匹配后缀名- 最终替换为捕获到的核心文件名加
.cpp后缀
方案2:纯Bash原生实现(无额外依赖)
不需要安装任何额外工具,用Bash内置的参数扩展即可实现,兼容性更强:
- 先执行测试脚本,仅打印修改前后的文件名,确认无误再执行实际重命名:
for file in *.cpp; do after_underscore="${file##*_}" name_before_ext="${after_underscore%.cpp}" core_name="${name_before_ext%%-*}" new_name="${core_name}.cpp" echo "将 $file 重命名为 $new_name" done
- 确认输出符合预期后,把
echo行替换为mv命令执行重命名,-n参数防止覆盖已有文件:
for file in *.cpp; do after_underscore="${file##*_}" name_before_ext="${after_underscore%.cpp}" core_name="${name_before_ext%%-*}" new_name="${core_name}.cpp" mv -n -- "$file" "$new_name" done
内容的提问来源于stack exchange,提问作者MaddieP
相关产品推荐
相关产品推荐

