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

如何使用Bash脚本删除文件名开头多个连续点以取消文件隐藏

Bash批量删除文件名前导连续点脚本优化方案

你原有脚本的核心问题是使用的${i#"$period"}是最短前缀匹配,仅会删除第一个开头的点,无法匹配连续多个前置点。

优化后完整脚本

#!/bin/bash
# 开启Bash扩展通配符支持
shopt -s extglob

for i in "$@"; do
    # 匹配开头有连续点的隐藏文件
    if [[ "$i" = \.* ]]; then
        # 最长匹配删除开头所有连续的点
        new_name="${i##+(\.)}"
        mv -- "$i" "$new_name"
    else
        # 普通文件加前缀点设为隐藏
        mv -- "$i" ".${i}"
    fi
done

核心逻辑说明

  • shopt -s extglob开启Bash的扩展通配符能力,此时+(\.)语法等价于正则中的\.+,可匹配1个及以上连续的点
  • ${i##+(\.)}使用最长前缀匹配规则,直接删掉文件名开头所有连续的点,不管前缀有多少个点都可以一次性处理完成
  • mv命令前加--参数,兼容文件名以-开头的场景,避免mv将文件名识别为命令参数
  • 遍历参数时使用"$@"而非无引号的$@,避免文件名带空格、特殊字符时出现拆分错误

替代实现(无需开启extglob,兼容性更强)

如果你需要在没有Bash扩展通配符的环境运行,也可以配合sed实现前缀点删除,替换new_name的赋值逻辑即可:

new_name=$(echo "$i" | sed 's/^\.*//')

测试建议

正式运行前可先将脚本中的mv命令替换为echo,先预览改名结果,确认无误后再执行实际改名操作,避免误操作:

# 测试用示例,只打印执行命令不实际改名
echo "mv -- '$i' '$new_name'"

内容的提问来源于stack exchange,提问作者honj - t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:02