我正在编写一个脚本,用于检查某个目录中是否有以特定单词开头的任何子目录。
到目前为止,这是我的脚本:
#!/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.