众所周知,我们可以通过以下 bash 命令轻松检查文件夹是否存在
[[ -d /opt/presto-server ]] && echo folder exist
但是当我们有文件夹时
/opt/presto-server-32.34
那么如何使用正则表达式来验证该文件夹是否存在
有了这个规则
presto-server-<any charecter>
作为
presto-server-454.545
presto-server-4a-434
presto-server-aa-434-l
ETC
答案1
我会计算通配符扩展产生了多少个参数。首先,我会进行设置nullglob
,以便如果没有匹配项,我们会得到预期的零而不是通配符本身。
shopt -s nullglob
然后请求所需模式的扩展并将其设置为当前参数:
set -- /opt/presto-server-*/
请注意添加尾部斜杠 - 这要求结果匹配是目录(或目录的符号链接)。
然后问有多少个:
[ "$#" -gt 0 ] && echo "There are one or more presto-server- directories"
答案2
您可以定义一个函数,has_dirs
例如:
has_dirs() {
for f do
[ -d "$f" ] && return
done
false
}
并将其用作:
if has_dirs /opt/presto-server-*; then
echo there are matching dirs
fi
这适用于目录或目录的符号链接。仅对于目录,您需要:
[ -d "$f" ] && [ ! -L "$f" ] && return
要更具体地匹配prestor-server-<number>-<number>
, 与bash
, 您可以执行以下操作:
shopt -s extglob # to enable a subset of ksh extended globs
has_dirs /opt/presto-server-+([[:digit:]])-+([[:digit:]])
尽管请注意,它可能会给出误报,但有一个名为字面意思的目录/opt/presto-server-+([[:digit:]])-+([[:digit:]])
(failglob
或nullglob
选项可以解决这个问题)。
答案3
如果可以选择切换到zsh
:
if ()(($# > 0)) /opt/presto-server-*(N/); then
echo there are directories matching that pattern
fi
在哪里
() compound-command args
是一个带参数的匿名函数((...))
...
:计算算术表达式并返回的复合命令成功如果结果不是 0。$# > 0
$#
:如果(该匿名函数的参数数量)大于 0,则计算结果为 1 的算术表达式。(N/)
:glob 限定符:为该 globN
打开,仅选择该类型的文件nullglob
/
目录(更改为-/
还包括目录的符号链接)。
这并不是非常有效,因为它会计算稍后排序的整个目录列表(需要对每个匹配文件zsh
执行 a 操作lstat()
),而只找到一个目录就足够了。
您可以更改*
为 来<->-<->
专门匹配由 分隔的数字序列-
。
当然,在 内bash
,您始终可以执行以下操作:
if zsh -c '()(($# > 0)) /opt/presto-server-<->-<->(N/)'; then
echo there are directories matching that pattern
fi