如何在 Bash 中使用正则表达式测试文件夹是否存在?

如何在 Bash 中使用正则表达式测试文件夹是否存在?

众所周知,我们可以通过以下 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:]])failglobnullglob选项可以解决这个问题)。

答案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

相关内容