我正在編寫一個腳本,用於檢查某個目錄中是否有以特定單字開頭的任何子目錄。
到目前為止,這是我的腳本:
#!/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.