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

求助:使用Bash正则或字符串索引修改工件文件名

解决方案:Bash脚本重命名特定格式的工件文件

没问题,我给你几个实用的Bash方案,完美匹配你这两种文件名的修改需求:

方案一:纯Bash内置参数扩展(推荐,无需额外工具)

这个方案用Bash自带的字符串处理功能,兼容性拉满,不用安装任何额外工具。你可以写一个循环脚本批量处理:

#!/bin/bash

# 遍历所有符合格式的tesla-server压缩包
for file in tesla-server-*.tgz; do
    # 第一步:去掉#及后面的数字部分(比如#34)
    temp_name="${file%#*.tgz}"
    
    # 第二步:判断是否是master分支的文件,如果是则去掉-master后缀
    if [[ "$temp_name" == *-master ]]; then
        new_name="${temp_name%-master}.tgz"
    else
        new_name="${temp_name}.tgz"
    fi
    
    # 执行重命名(-v参数显示重命名详情,可去掉)
    mv -v "$file" "$new_name"
done

代码解释:

  • ${file%#*.tgz}:从文件名右侧匹配第一个#*.tgz模式,然后删除匹配到的部分,比如把tesla-server-1.1.1-develop#34.tgz变成tesla-server-1.1.1-develop。
  • ${temp_name%-master}:如果临时文件名以-master结尾,就删除这个后缀,比如把tesla-server-1.1.1-master变成tesla-server-1.1.1。
  • mv -v:显示重命名的详细过程,方便你确认操作是否正确。

方案二:用Perl版rename命令(简洁高效)

如果你用的是Debian/Ubuntu这类系统,默认的rename是Perl版本的,可以用正则一次性处理所有文件:

# 一次性处理两种情况的重命名
rename 's/\-master#\d+\.tgz/.tgz/; s/#\d+\.tgz/.tgz/' tesla-server-*.tgz

正则解释:

  • 第一个替换s/\-master#\d+\.tgz/.tgz/:把-master#数字.tgz直接替换成.tgz,处理master分支的文件。
  • 第二个替换s/#\d+\.tgz/.tgz/:把#数字.tgz替换成.tgz,处理develop(或其他分支)的文件。

注意:如果是CentOS/RHEL这类系统,默认的rename是另一个版本,语法不同,建议用方案一或者安装Perl版的rename(yum install prename)。

方案三:用sed生成新文件名

如果你习惯用sed处理字符串,也可以这样写循环:

#!/bin/bash

for file in tesla-server-*.tgz; do
    # 用sed做两次正则替换,先处理master分支,再处理其他分支
    new_name=$(echo "$file" | sed -E 's/(.*)-master#.*\.tgz/\1.tgz/; s/(.*)#.*\.tgz/\1.tgz/')
    mv -v "$file" "$new_name"
done

效果验证:

执行以上任意方案后,你的文件会被正确修改:

  • tesla-server-1.1.1-develop#34.tgz → tesla-server-1.1.1-develop.tgz
  • tesla-server-1.1.1-master#34.tgz → tesla-server-1.1.1.tgz

内容的提问来源于stack exchange,提问作者JonB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:24:39