如何用正则表达式查找文件夹的真实路径

如何用正则表达式查找文件夹的真实路径

presto是分布式SQL查询引擎,

当我们安装 presto 时,应该创建以下主文件夹

/application/DB/presto/presto-server-0.216

所以我们可以说

为了捕捉回家的快感,我们可以做(它是我的 bash 脚本的一部分

PRESTO_HOME=` find  /application/DB/presto/ -maxdepth 1 | grep  presto-server `
echo $PRESTO_HOME
/application/DB/presto//presto-server-0.216

但是...因为某些用户可以重命名下面的文件夹/应用程序/DB/presto/为了安装新版本

然后在/应用程序/DB/presto,我们可以得到以下文件夹:

/application/DB/presto/presto-server-HOLD_0.211
/application/DB/presto/_presto-server-0.212
/application/DB/presto/backup_presto-server-0.216.new
/application/DB/presto/presto-server-0.210.old
/application/DB/presto/presto-server-0.212.orig

所以关于这一点

为了找到真正的路径,正确的语法是什么

/application/DB/presto/presto-server-0.216

笔记:

presto 文件夹结构始终为

presto-server-[ 任意浮点数或整数 ]

有效示例:

/application/DB/presto/presto-server-0.736
/application/DB/presto/presto-server-0.936
/application/DB/presto/presto-server-1
/application/DB/presto/presto-server-1.9
/application/DB/presto/presto-server-12

无效的示例:

/application/DB/presto/presto-server-0.736-43.previos
/application/DB/presto/presto-server-0.936_old
/application/DB/presto/orig_presto-server-1
/application/DB/presto/presto-server-1.9.bck
/application/DB/presto/presto-server-PREVIOS
/application/DB/presto/presto-server-
/application/DB/presto/presto-server-0.936_old
/application/DB/presto/orig_presto-server-1.other
/application/DB/presto/presto_server-1.9.bck
/application/DB/presto/OLD_presto-server-12-83

答案1

根据您使用的 shell,您可以通过通配符来实现。

巴什

#! /bin/bash -
shopt -s nullglob extglob
dirs=(/application/DB/presto/presto-server-+([[:digit:]])*(.+([[:digit:]])))

printf '%s\n' "Found ${#dirs[@]} matching directories:" "${dirs[@]}"

桀骜

#! /bin/zsh -
set -o extendedglob
dirs=(/application/DB/presto/presto-server-<->(.<->)#(N))

printf '%s\n' "Found $#dirs matching directories:" $dirs

克什93

#! /bin/ksh93 -
dirs=(~(N)/application/DB/presto/presto-server-+([[:digit:]])*(.+([[:digit:]])))

printf '%s\n' "Found ${#dirs[@]} matching directories:" "${dirs[@]}"

对于所有数字,其后presto-server-跟 1 个或多个数字的序列,后跟 0 个或多个 的序列.<digits>

答案2

通过 GNU find 的-regex测试,您可以使用:

find /application/DB/presto/ -regex '/application/DB/presto/presto-server-\([0-9]*\.\)?[0-9]+'

...这需要前导路径,然后是数字部分:

  • 可选:前导数字和句点
  • 一位或多位数字

这仅匹配您的所有“有效”示例,而不匹配您的“无效”示例。

如果您想在任何前导句点之前需要一个数字,请将 更改为[0-9]*[0-9]+和...之间的不同:

/application/DB/presto/presto-server-0.936

/application/DB/presto/presto-server-.936

相关内容