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

如何在Bash中用正则捕获文件名开头,截取?前部分重命名?

解决Bash脚本重命名含?文件的问题

我来帮你搞定这个问题!你遇到的核心问题其实是Bash里对特殊字符?的处理,以及正确截取字符串的方法。下面给你分步拆解可行的解决方案:

先测试:打印原文件名和目标文件名

先不要直接重命名,先运行测试脚本确认截取逻辑是否符合你的预期:

for file in *\?*; do
    # 跳过目录或非文件类型的条目
    [ -f "$file" ] || continue
    # 截取第一个?之前的所有内容(最长匹配删除?及后面的部分)
    new_name="${file%%\?*}"
    echo "原文件名: '$file' → 新文件名: '$new_name'"
done

关键细节说明:

  • *\?*:这里的\?是转义后的问号,因为Bash中?是通配符(匹配单个任意字符),必须转义才能匹配文件名里的字面问号。
  • ${file%%\?*}:这是Bash的参数扩展语法,%%表示从右往左最长匹配并删除指定模式。这里的模式\?*会匹配第一个?及其后面的所有内容,删除后就得到?之前的部分。
    • 如果你想要截取到**最后一个?**之前的内容,把%%换成%即可(%是从右往左最短匹配)。

正式重命名脚本

确认测试结果符合预期后,把打印换成mv命令,加上-i参数防止意外覆盖已存在的文件:

for file in *\?*; do
    [ -f "$file" ] || continue
    new_name="${file%%\?*}"
    # -i 参数会在覆盖前提示确认,更安全
    mv -i "$file" "$new_name"
done

额外注意事项:

  • 所有变量都用双引号包裹,避免文件名含空格、特殊字符时出错。
  • 如果你的文件目录下有目录也包含?,脚本里的[ -f "$file" ] || continue会自动跳过它们,只处理文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:20:39