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

批量重命名文件:移除短横线分隔的文件名第3段内容

批量移除文件名中指定分段的解决方案

你的原脚本问题在于用固定长度字符截断,无法适配第三段长度变化的情况,以下是两种可靠的解决方法:

方法一:Bash 参数扩展实现

利用 Bash 字符串处理特性,精准提取需要保留的部分:

#!/bin/bash
for file in X*-*-*-*.txt; do
    # 提取前两段 + 最后一段
    new_name="${file%-*%-*}-${file##*-}"
    # -v 参数用于显示重命名过程,可省略
    mv -v "$file" "$new_name"
done

语法解释:

  • ${file%-*%-*}:先通过%-*移除最后一个-及后续内容得到前三段;再执行一次%-*移除该结果的最后一个-及后续内容,最终保留前两段(如X103032720-20230630)
  • ${file##*-}:移除最后一个-之前的所有内容,保留最后一段(如3.txt)
  • 用-拼接两部分,得到目标文件名

方法二:Perl 版 rename 命令(推荐)

如果系统装有 Perl 版rename(大部分 Linux 发行版默认自带),可以用正则表达式批量替换:

# 先执行测试模式(-n 参数),确认输出正确后再移除 -n
rename -n 's/^([^-]+-[^-]+)-[^-]+-(.*)$/\1-\2/' X*-*-*-*.txt

正则解释:

  • ^([^-]+-[^-]+):匹配文件名开头的前两段(以-分隔),并捕获为分组1
  • -[^-]+-:匹配要删除的第三段(包含前后的-)
  • (.*)$:匹配剩余的最后一段及文件后缀,捕获为分组2
  • \1-\2:替换为分组1 + - + 分组2,即保留需要的部分

适配 macOS/BSD 系统

如果是 macOS 或 BSD 系统,默认是 BSD 版rename,语法不同,可结合sed实现:

# 先测试输出,确认正确后移除 echo
for file in X*-*-*-*.txt; do
    echo mv "$file" "$(echo "$file" | sed -E 's/^([^-]+-[^-]+)-[^-]+-(.*)$/\1-\2/')"
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:12:54