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

Linux下基于分隔符批量重命名文件的技术求助

解决方案

先结合你的描述和示例,整理出三种最贴合实际需求的场景,对应不同的重命名规则:

场景1:只保留最后一个“-”之后的内容

比如将 R01235-XYZ-TRAIL.PDF → TRAIL.PDF,XYZ-C12345-TRAIL.PDF → TRAIL.PDF

用Perl版本的rename命令(多数Linux发行版默认自带,若系统是C版rename可改用prename):

rename 's/.*-//' *.PDF

正则说明:.*-匹配从文件名开头到最后一个“-”的所有内容,替换为空后仅保留后缀部分。

如果用bash循环搭配sed实现:

for file in *.PDF; do
  newname=$(echo "$file" | sed 's/.*-//')
  mv "$file" "$newname"
done

场景2:删除第一个“-”及其之前的内容,保留后续所有部分

比如将 R01235-XYZ-TRAIL.PDF → XYZ-TRAIL.PDF,XYZ-C12345-TRAIL.PDF → C12345-TRAIL.PDF(匹配你的第二个示例)

Perl rename命令:

rename 's/^[^-]+-//' *.PDF

正则说明:^[^-]+-匹配从开头到第一个“-”的所有非“-”字符,替换为空后保留后面的字段组合。

bash循环版:

for file in *.PDF; do
  newname=$(echo "$file" | sed 's/^[^-]*-//')
  mv "$file" "$newname"
done

场景3:删除两个“-”之间的中间字段,保留首尾部分

比如将 R01235-XYZ-TRAIL.PDF → R01235-TRAIL.PDF(修正你第一个示例的笔误后)

Perl rename命令:

rename 's/^([^-]+)-[^-]+-(.*)$/$1-$2/' *.PDF

正则说明:通过分组捕获,$1提取第一个“-”前的内容,$2提取最后一个“-”后的内容,中间字段被直接替换。

bash循环版:

for file in *.PDF; do
  newname=$(echo "$file" | sed -E 's/^([^-]+)-[^-]+-(.*)$/\1-\2/')
  mv "$file" "$newname"
done

实用提示

  • 测试命令:Perl版rename可加-n参数预览重命名结果,bash循环可在mv前加echo,避免误操作。
  • 若系统只有C版rename,建议直接用bash循环方案,兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:55:30