求助:使用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.tgztesla-server-1.1.1-master#34.tgz→tesla-server-1.1.1.tgz
内容的提问来源于stack exchange,提问作者JonB
相关产品推荐
相关产品推荐

