【问题标题】:How to find a sub directory using Regex in Bash script [duplicate]如何在 Bash 脚本中使用正则表达式查找子目录 [重复]
【发布时间】:2021-11-11 07:11:00
【问题描述】:

目录位置:/var/lib/messageFunction-7834bdfjsdfj783/data/snapshot

我有上述目录,我需要使用 bash 脚本查找该目录是否存在。

#!/bin/bash

if [ ! -d "/var/lib/messageFunction-*/data/snapshot" ]; then
echo NO FOLDER
else
echo FOLDER IS THERE
fi

上述脚本始终返回“NO FOLDER”,但该目录存在于该位置。您能指导如何使用正则表达式来识别子目录吗?

谢谢

【问题讨论】:

  • '*' 不在引号内展开。它实际上是在测试名为/var/lib/messageFunction-*/data/snapshot 的目录,该目录将不存在。如下所示的迭代解决方案是正确的方法,或者使用find 并循环输出(或grep 等。)同样在路径名扩展中'*' 是文件名通配符的一部分,而不是正则表达式。 .
  • 如果有多个目录匹配 glob /var/lib/messageFunction-*/data/snapshot 怎么办?
  • 关于为什么不引用* 可能有更好的副本,但我想你已经解决了这个问题。

标签: bash shell


【解决方案1】:

不完全是您要求的,而是我将如何解决此问题的另一种解决方案。 首先遍历与第一部分匹配的所有目录,然后检查数据/快照目录是否在其中:

#!/bin/bash
for myDir in /var/lib/messageFunction-*; do
    if [ ! -d "$myDir/data/snapshot" ]; then
        echo "NO FOLDER"
    else
        echo "FOUND IN $myDir"
    fi
done

【讨论】:

    【解决方案2】:

    你可以使用“find”命令(不是“ls”——同意):

    if [[ -n $(find /var/lib/ --max-depth=0 -type d -name "messageFunction-*" 2>/dev/null) ]]; then
        echo "OK"
    else
        echo "Not found"
    fi
    

    地点:

    /var/lib/(搜索路径)

    --max-depth=0(不要在子目录中搜索)

    -type d(仅搜索目录)

    -name "messageFunction-*"(目录通配符名称)

    2>/dev/null(不捕获错误信息)

    【讨论】:

    • 此解决方案不会区分文件和目录
    • 不,don't use ls in scripts;它非常容易出错且笨拙。
    • 同意“ls” - 是个坏主意,改用“find”。
    猜你喜欢
    • 2022-01-13
    • 2010-09-23
    • 2019-11-16
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多