请求编写Bash脚本:移除文件名两圆点间子串以重命名文件
批量重命名文件:移除两个圆点间的子串(修复重复扩展名问题)
问题分析
原脚本的参数展开逻辑存在错误,${file%%.*.*-*}的匹配规则无法精准识别第一个圆点到最后一个圆点之间的内容,且${file##*.}会无条件追加后缀,导致出现重复扩展名的问题。我们需要精准提取第一个圆点前的前缀和最后一个圆点后的后缀,再将二者拼接即可得到目标文件名。
修正后的脚本
#!/bin/bash # 遍历当前目录下的jpg和txt文件 for file in *.jpg *.txt; do # 仅处理包含至少两个圆点的文件(确保有可移除的中间部分) if [[ "$file" == *.*.* ]]; then # 提取第一个圆点前的前缀 prefix="${file%%.*}" # 提取最后一个圆点后的后缀 suffix="${file##*.}" # 拼接新文件名 new_file="${prefix}.${suffix}" # 执行重命名(加上-v参数可查看重命名过程,可选) mv -v "$file" "$new_file" fi done
验证示例
- 原文件名:
AAAAAAAA.BBBBB-BBB.jpg→ 处理后:AAAAAAAA.jpg - 原文件名:
mmmmmmmmmm.vvv-yyyyy.txt→ 处理后:mmmmmmmmmm.txt
关键说明
${file%%.*}:从字符串末尾开始匹配最短的.*,即截取第一个圆点之前的所有内容${file##*.}:从字符串开头开始匹配最长的*.,即截取最后一个圆点之后的所有内容- 条件判断
[[ "$file" == *.*.* ]]确保只处理包含至少两个圆点的文件,避免对单扩展名文件(如test.jpg)误操作 - 给
mv命令加上-v参数可以显示重命名的详细过程,方便调试
内容的提问来源于stack exchange,提问作者COLIN GHERGHE
相关产品推荐
相关产品推荐

