command line - 在bash中,如何在查找目录路径时使用正规表达式?

・4 分钟阅读

问题

我写了一个小bash脚本来查找我的用户$HOME中名为anaconda或miniconda的目录。但脚本在我home中找不到miniconda2目录。

我怎么修复这个问题?


if [ -d"$HOME"/"(ana|mini)conda[0-9]?" ]; then


 echo"miniconda directory is found in your $HOME"


else


 echo"anaconda/miniconda is not found in your $HOME"


fi



P.S :如果我有 [ -d"$HOME"/miniconda2 ]; then 然后它找到miniconda2目录所以,我认为错误在于部分"(ana mini)conda [0-9 ]"

我希望脚本是通用的。


回答1:

这是个非常棘手的事情。

基本上,-d只测试一个参数-即使你可以使用正则表达式匹配文件名。

一种方法是翻转问题,测试目录的正则表达式匹配,而不是测试正则表达式匹配目录。换句话说,使用简单的shell循环$HOME中的所有目录,并对正规表达式进行测试,并测试BASH_REMATCH数组是否是非空,


#!/bin/bash



for d in"$HOME"/*/; do


 if [[ $d =~ (ana|mini)conda[0-9]? ]]; then


 break;


 fi


done



if ((${#BASH_REMATCH[@]} > 0)); then


 echo"anaconda/miniconda directory is found in your $HOME"


 else


 echo"anaconda/miniconda is not found in your $HOME"


fi



另一种方法是使用扩展的shell glob代替正则表达式,并捕获数组中的任何glob匹配。然后测试数组是否为非空:


#!/bin/bash



shopt -s extglob nullglob



dirs=("$HOME"/@(ana|mini)conda@(|[0-9])/ )



if (( ${#dirs[@]} > 0 )); then


 echo"anaconda/miniconda directory is found in your $HOME"


else


 echo"anaconda/miniconda is not found in your $HOME"


fi



尾随/确保只匹配目录; nullglob防止shell在零匹配情况下返回不匹配的字符串。


回答2

实际上,正如已经提到的,这很棘手。我的方法如下:

  • 使用find及它正规表达式功能查找所需的目录,
  • find为每个找到的目录打印一个x
  • x es存储在字符串中
  • 如果字符串为非空,则找到其中一个目录,

因此:


xString=$(find $HOME -maxdepth 1 


 -type d 


 -regextype egrep 


 -regex"$HOME/(ana|mini)conda[0-9]?" 


 -printf 'x');


if [ -n"$xString" ]; then


 echo"found one of the directories";


else


 echo"no match.";


fi



说明:

  • find $HOME -maxdepth 1 查找$HOME下面的所有内容,但是,将搜索限制在一个级别(即: 它不递归到子目录中),
  • -type d仅将搜索限制为directories
  • -regextype egrep告诉find我们处理的正则表达式是什么类型,这是需要的,因为[0-9]?(…|…)类似的东西是特殊的,find不认识它们,
  • -regex"$HOME/(ana|mini)conda[0-9]?" 是我们要注意的实际正则表达式
  • -printf'x'只为满足上述条件的每件事打印一个x

回答3

可能的解决方法是分别搜索miniconda和anaconda,如下所示,


if [ -d"$HOME"/miniconda* ] || [ -d"$HOME"/anaconda* ]; then


 echo"miniconda directory is found in your $HOME"


else


 echo"anaconda/miniconda is not found in your $HOME"


fi




讨论
Tianye profile image