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

