Bash循环遍历前10个子目录异常:原因及固定选取方法
为什么你的命令只输出8个目录?
你的命令for d in ./output/*[0..9]; do echo $d done存在两个核心问题:
通配符逻辑理解错误:
*[0..9]并不是“选取前10个目录”,而是Bash的字符范围匹配规则——它会匹配所有文件名末尾包含0、.、9这三个字符中任意一个的目录。这就导致只有那些目录名最后一位是0、.或者9的项会被选中,其他不符合这个规则的目录都被过滤掉了,这就是你只得到8个结果的原因。语法小疏漏:你的循环语句缺少必要的分隔符,正确写法应该是
do echo "$d"; done(给变量加上双引号,还能避免文件名含空格时出现异常)。
如何固定选取指定数量的目录?
要实现“遍历前10个子目录”的需求,最可靠的方法是用数组存储所有目录,能完美处理文件名含空格、特殊字符的场景:
# 将output下的所有子目录存入数组(末尾的/确保只选目录,排除文件) dirs=(./output/*/) # 遍历数组的前10个元素 for d in "${dirs[@]:0:10}"; do echo "$d" done
语法解释:
./output/*/:精准匹配output目录下的所有子目录,不会包含普通文件"${dirs[@]:0:10}":Bash数组的切片语法,0代表起始索引,10代表要选取的元素数量,能精准获取前10个目录
如果你习惯用管道方式(注意:若目录名含空格,这种方式可能出现异常,谨慎使用):
ls -d ./output/*/ | head -n 10 | while read -r d; do echo "$d" done
内容的提问来源于stack exchange,提问作者David Z
相关产品推荐
相关产品推荐

