Linux终端如何用for循环、find和if语句判断子目录是否在指定数组
解决方案
首先修正原代码的几个错误点,再给出判断子目录名是否在数组中的实现:
原代码待修正问题
- Bash数组用空格分隔元素,不要加逗号,否则生成的元素会自带逗号不符合预期
- 不要用
ls获取子目录列表,遇到带空格/特殊字符的文件名会解析异常,且原写法把ls结果赋值为字符串而非数组,遍历会出错 - 原判断逻辑中的
$d是未定义变量,应该对应遍历到的子目录变量$subfolder
最终可运行代码
#!/bin/bash # 声明上层目录数组 declare -a folderlist=("a1" "a2") # 声明要匹配的子目录数组 declare -a checklist=("w" "s") # 先把checklist转成关联数组,用来快速判断元素是否存在 declare -A check_map for item in "${checklist[@]}"; do check_map["$item"]=1 done # 遍历上层目录 for folder in "${folderlist[@]}"; do # 遍历当前上层目录下的所有子目录,避免特殊字符解析异常 for subfolder in ./"$folder"/*/; do # 提取子目录的纯名称(去掉路径和末尾的/) sub_name=$(basename "$subfolder") # 判断是否在checklist中 if [[ ${check_map["$sub_name"]} ]]; then echo "$subfolder" fi done done
核心逻辑说明
你需要替换的硬编码判断逻辑,通过关联数组(哈希索引)实现O(1)效率的存在性判断,比每次遍历checklist的写法性能更高,非常适合checklist元素较多的场景:
- 提前遍历
checklist把所有需要匹配的子目录名存为关联数组的key - 判断时直接取关联数组对应
$sub_name的value,存在就说明子目录名在匹配名单内
运行效果
在你给出的目录结构下运行后,输出完全符合预期:
./a1/w/ ./a2/s/
内容的提问来源于stack exchange,提问作者Ellie
相关产品推荐
相关产品推荐

