如何在Bash脚本中使用正则匹配查找指定子目录是否存在
问题原因
你写的脚本失效核心原因是引号会阻止Bash通配符展开,[ -d ]参数接收的是带字面量*的路径,自然无法匹配到包含随机字符串的实际目录。
解决方案
方案1:数组匹配(推荐,适配多匹配结果场景)
通过数组接收通配符展开的结果,判断数组长度即可确认目录是否存在:
#!/bin/bash # 开启nullglob:匹配不到结果时数组为空,不会保留*字面量 shopt -s nullglob snapshot_dirs=(/var/lib/messageFunction-*/data/snapshot) # 恢复nullglob默认配置,避免影响后续脚本逻辑 shopt -u nullglob if [[ ${#snapshot_dirs[@]} -gt 0 ]]; then echo "FOLDER IS THERE" # 如需使用实际路径,直接取${snapshot_dirs[0]}即可 else echo "NO FOLDER" fi
方案2:find命令匹配
如果不想修改shell配置,也可以用find命令做路径匹配:
#!/bin/bash # maxdepth设为3避免遍历过深,匹配到符合规则的目录就返回成功 if find /var/lib -maxdepth 3 -type d -path "*/messageFunction-*/data/snapshot" | grep -q .; then echo "FOLDER IS THERE" else echo "NO FOLDER" fi
注意事项
不要把带通配符的路径包裹在单/双引号内,否则通配符会被识别为普通字符,无法完成模糊匹配。
内容的提问来源于stack exchange,提问作者Jagadeesan G
相关产品推荐
相关产品推荐

