使用正则表达式检查特定目录是否有以特定单词开头的文件夹

使用正则表达式检查特定目录是否有以特定单词开头的文件夹

我正在编写一个脚本,用于检查某个目录中是否有以特定单词开头的任何子目录。

到目前为止,这是我的脚本:

#!/bin/bash

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex=

    if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

那么,如何regex检查特定目录是否有以特定单词开头的文件夹呢?

答案1

-d不接受正则表达式,它接受文件名。如果你只想检查一个简单的前缀,通配符就足够了:

exists=0
shopt -s nullglob
for file in "$themeDirectory"/word* "$iconDirectory"/* ; do
    if [[ -d $file ]] ; then
        exists=1
        break
    fi
done
if ((exists)) ; then
    echo Directory exists.
else
    echo "Directories don't exist."
fi

nullglob如果没有匹配项,则使通配符扩展为空列表。在较大的脚本中,在子 shell 中更改其值,或者在不需要时设置回旧值。

答案2

如果您只想查找与给定模式/前缀匹配的目录,我认为您可以使用find

find /target/directory -type d -name "prefix*"

或者,如果你只想即时子目录:

find /target/directory -maxdepth 1 -type d -name "prefix*"

-regex当然,如果您需要实际的正则表达式匹配,也可以。 (警告:我不记得 -maxdepth 是否是 gnu 主义。)

(更新)是的,你想要一个 if 语句。 Find 总是返回零,因此我们不能使用返回值来检查是否找到了任何内容(与 grep 不同)。但我们可以计算行数。通过管道输出wc来获取计数,然后查看它是否不为零:

if [ $(find /target/directory -type d -name "prefix*" | wc -l ) != "0" ] ; then
    echo something was found
else
    echo nope, didn't find anything
fi

答案3

变量的名称regex不会被很好地选择,但请考虑将值设置为"$1"like regex="$1"。下一步是将if语句更改为:

if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then

if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then

该脚本将变为:

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex="$1"

    if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

从 shell 中,您可以通过以下方式获取脚本:

. /path/to/script

该函数已可供使用:

checkDirectory test
Directories don't exist.

相关内容