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

Bash中如何检查符合特定命名规则的目录是否存在

解决Bash中检查特定规则目录是否存在的问题

你遇到的问题核心在于双引号把通配符*给转义成了字面量——当你写"~/pkg_*"时,Bash不会将*展开成匹配的目录名,而是直接检查是否存在一个字面名为~/pkg_*的目录,这显然不存在,所以无论实际有没有符合条件的目录,判断都会返回false。

下面给你几种可靠的实现方法:

方法1:利用数组+nullglob选项(推荐,可获取匹配目录)

这个方法不仅能判断是否存在,还能保存所有匹配的目录供后续使用:

# 开启nullglob选项:如果通配符没有匹配到任何内容,会展开为空字符串
shopt -s nullglob
# 将所有匹配的目录存入数组
pkg_dirs=(~/pkg_*)
# 检查数组长度是否大于0(即是否有匹配目录)
if [ ${#pkg_dirs[@]} -gt 0 ]; then
    echo "找到符合条件的目录:${pkg_dirs[*]}"
else
    echo "未找到任何以pkg_开头的目录"
fi
# 可选:关闭nullglob,恢复shell默认行为
shopt -u nullglob

方法2:使用compgen命令(简洁,无需修改shell选项)

compgen是Bash内置命令,专门用来生成补全候选,这里可以用来检查通配符是否有匹配:

if compgen -G "~/pkg_*" > /dev/null; then
    echo "存在符合条件的目录"
else
    echo "不存在符合条件的目录"
fi

-G选项让compgen按照文件名通配符来匹配,输出结果重定向到/dev/null是因为我们只关心命令的退出状态(0表示有匹配,1表示无匹配)。

方法3:直接展开通配符(注意边界情况)

如果你确定最多只有一个匹配的目录,或者能接受多个匹配时的报错,可以直接去掉双引号:

if [ -d ~/pkg_* ]; then
    echo "存在符合条件的目录"
else
    echo "不存在符合条件的目录"
fi

⚠️ 注意:如果有多个目录匹配~/pkg_*,[ -d ]会因为参数过多而报错;如果没有匹配,Bash会把~/pkg_*当作字面量,判断结果还是false,所以这种方法局限性较大,不推荐在通用场景使用。

内容的提问来源于stack exchange,提问作者Find Me In The Woods

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:50