<p>在Linux中遍历目录时跳过隐藏文件夹,应使用[[ "$f" == . ]]判断并跳过,或用find . -maxdepth 1 -type d ! -name "."安全排除;注意dotglob选项影响*匹配行为。</p>

在Linux中遍历目录时跳过隐藏文件夹(即以点 . 开头的目录),关键在于过滤掉以 . 开头且为目录的条目。常用方法是结合 for 循环与条件判断,或使用更健壮的 find 命令。
用 for 循环 + test 判断跳过隐藏目录
基础 for 循环默认会匹配所有文件和目录(包括 . 和 ..),需手动排除:
- 用
[ -d "$f" ] && [ "${f#./}" != "${f#.}" ]可判断是否为隐藏目录(但更推荐用前缀判断) - 更清晰的方式是检查名字是否以
.开头:[[ "$f" == .* ]] - 注意:要先确保不处理
.和..,它们虽是隐藏项,但属于特殊目录
示例脚本:
for f in *; do [[ -d "$f" ]] || continue # 只处理目录 [[ "$f" == .* ]] && continue # 跳过隐藏目录(含 .git、.config 等) echo "进入目录: $f" # cd "$f" && ... done
用 find 命令更安全地遍历非隐藏目录
find 更适合复杂遍历,天然支持排除模式,且不会误触 ./..:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
find . -maxdepth 1 -mindepth 1 -type d ! -name ".*":列出当前目录下所有非隐藏子目录(不含当前目录和隐藏项) -
! -name ".*"表示“名称不匹配.*模式”,能准确排除.cache、.local等,但保留foo.bar这类非隐藏名 - 配合
-exec或 while read 可安全执行操作
示例:
find . -maxdepth 1 -mindepth 1 -type d ! -name ".*" | while IFS= read -r dir; do
echo "处理目录: ${dir#./}"
# your command here
done注意 shell 的 glob 选项影响行为
某些 shell(如 bash)默认不匹配以 . 开头的文件,但 * 本身不包含隐藏项 —— 除非设置了 dotglob 选项:
- 运行
shopt dotglob查看是否启用;若启用,*会包含隐藏文件/目录 - 为避免意外,可在循环前临时关闭:
shopt -u dotglob - 即使未开启
dotglob,.和..仍会被*忽略,但显式写.*会匹配它们,所以不要用.*来遍历目录
进阶:跳过隐藏目录并递归处理子目录
如果需要递归进入子目录(但仍跳过所有层级中的隐藏目录),find 是首选:
# 递归遍历,完全跳过任何名为 .* 的目录(及其内容)
find . -type d ! -name ".*" -exec echo "访问: {}" \;该命令会进入 ./a、./a/b,但跳过 ./.git、./a/.temp 等所有隐藏目录,也不会进入其内部。

















