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

如何在循环中利用ls命令结果判断各条目是否为目录

嘿,我懂你想要实现的效果——遍历ls输出的每一行,逐个判断对应的条目是不是目录对吧?不过先给你提个小建议:直接解析ls的输出其实不是最佳实践,因为文件名里如果包含空格、换行或者特殊字符,很容易触发脚本的bug。不过还是按照你的需求,给你两种可行的方案,其中一种更稳妥,推荐优先使用~

方案1:基于ls输出的循环(满足你的原始需求)

如果你一定要用ls的输出来做循环,这个脚本可以实现你的要求:

#!/bin/bash
# 读取ls的每一行输出,用-r参数保留原始字符避免转义问题
ls | while read -r entry; do
    # 用-d选项判断当前条目是否为目录,变量加双引号处理带空格的文件名
    if [ -d "$entry" ]; then
        echo "$entry is directory"
    fi
done

这里的read -r是关键,它能防止文件名里的反斜杠被错误转义;给$entry加上双引号则是为了避免脚本把带空格的文件名拆成多个参数,导致判断出错。

方案2:更安全的遍历方式(强烈推荐)

直接用shell的通配符(glob)来遍历目录条目,完全不需要依赖ls的输出,能完美处理各种特殊文件名,是业内推荐的写法:

#!/bin/bash
# 遍历当前目录下的所有条目(包括隐藏文件)
for entry in * .*; do
    # 跳过当前目录(.)和上级目录(..)这两个特殊条目
    if [[ "$entry" == "." || "$entry" == ".." ]]; then
        continue
    fi
    # 判断是否为目录
    if [ -d "$entry" ]; then
        echo "$entry is directory"
    fi
done

如果不需要处理隐藏文件,直接把循环改成for entry in *; do ...就可以了,代码会更简洁。

内容的提问来源于stack exchange,提问作者Yusuf Mu'min

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:00