如何在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
相关产品推荐
相关产品推荐

