linux-rename-ext-重命名多余后缀

目标:把 xxx.jpg.jpg → xxx.jpg,删掉末尾多余的 .jpg
方案 1:rename(Perl 版,Ubuntu/Debian 推荐)
先测试!加上 -n 只预览不修改
# 预览效果
rename -n 's/\.jpg$//' *.jpg.jpg
# 确认无误后执行重命名(去掉 -n,加 -v 显示过程)
rename -v 's/\.jpg$//' *.jpg.jpg

解释:\.jpg$ 匹配文件名最后的 .jpg,精准只删除尾部重复后缀。
CentOS/RHEL 默认是 util-linux 的 rename(C 版本,语法不一样),不要直接上面命令,改用下面循环方案。

方案 2:通用 Bash for 循环(所有 Linux 发行版通用,推荐)
进入图片所在目录执行:
# 预览,只打印将要执行的命令,不会改动文件
for f in *.jpg.jpg; do echo mv -v "$f" "${f%.jpg}"; done
# 确认没问题,去掉 echo 正式执行
for f in *.jpg.jpg; do mv -v "$f" "${f%.jpg}"; done
${f%.jpg} 含义:删除文件名末尾最短的 .jpg,完美处理 a.jpg.jpg → a.jpg。

方案 3:递归处理所有子文件夹(多层目录)
# 先预览
find . -type f -name "*.jpg.jpg" -exec bash -c 'for f do echo mv "$f" "${f%.jpg}"; done' _ {} +
# 正式执行
find . -type f -name "*.jpg.jpg" -exec bash -c 'for f do mv -v "$f" "${f%.jpg}"; done' _ {} +

⚠️重要提醒
永远先预览,看到改名规则正确再去掉 echo / -n;
如果存在同名文件(例如已有 a.jpg 和 a.jpg.jpg),mv 默认直接覆盖;
想要覆盖前询问可以加上 -i:
for f in *.jpg.jpg; do mv -vi "$f" "${f%.jpg}"; done

Leave a Reply

Your email address will not be published. Required fields are marked *