使用正規表示式檢查特定目錄是否包含以特定單字開頭的資料夾

使用正規表示式檢查特定目錄是否包含以特定單字開頭的資料夾

我正在編寫一個腳本,用於檢查某個目錄中是否有以特定單字開頭的任何子目錄。

到目前為止,這是我的腳本:

#!/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.

相關內容