You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bash脚本删除文件名多余信息的实现方法求助

Bash批量重命名文件名解决方案

根据你的文件名规则(核心名称位于最后一个下划线之后,后缀之前若有-数字后缀需删除),提供两种可直接使用的实现方案:

方案1:使用Perl版rename(简洁高效)

大部分Linux发行版、macOS(可通过brew install rename安装)均默认携带该工具,直接执行正则匹配批量重命名:

  1. 先执行测试命令,仅打印修改结果不会实际改名,确认匹配正确:
rename -n 's/.*_([^_-]+)(?:-\d+)?\.cpp/$1.cpp/' *.cpp
  1. 确认输出符合预期后,去掉-n参数执行实际重命名:
rename 's/.*_([^_-]+)(?:-\d+)?\.cpp/$1.cpp/' *.cpp

正则说明:

  • .*_:匹配从文件名开头到最后一个下划线的全部内容
  • ([^_-]+):捕获核心文件名,匹配所有不包含下划线、横杠的字符
  • (?:-\d+)?:匹配可选的-数字后缀,非捕获组不参与结果替换
  • \.cpp:匹配后缀名
  • 最终替换为捕获到的核心文件名加.cpp后缀

方案2:纯Bash原生实现(无额外依赖)

不需要安装任何额外工具,用Bash内置的参数扩展即可实现,兼容性更强:

  1. 先执行测试脚本,仅打印修改前后的文件名,确认无误再执行实际重命名:
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
  1. 确认输出符合预期后,把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:00