检查多个目录是否存在

检查多个目录是否存在

我想检查工作目录中是否存在多个目录,例如dir1dir2和。dir3

我有以下内容

if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
    echo True
else
    echo False
fi

但我认为还有更优雅的方法。不要假设目录名称中存在某种模式。

目标是检查一些目录是否存在以及其他目录是否不存在。

我使用的是 Bash,但首选可移植代码。

答案1

我会循环:

result=True
for dir in \
        "$PWD/dir1" \
        "$PWD/dir2" \
        "$PWD/dir3" 
do
    if ! [ -d "$dir" ]; then
        result=False
        break
    fi
done
echo "$result"

break会导致环路短路,就像您的链条一样&&

答案2

如果您已经期望它们是目录并且只是检查它们是否全部存在,则可以使用ls实用程序的退出代码来确定是否有一个或多个“发生错误”:

ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there

我将输出和 stderr 重定向到/dev/null以使它消失,因为我们只关心 的退出代码ls,而不关心它的输出。写入的任何内容都会/dev/null消失 - 它不会写入您的终端。

答案3

循环可能更优雅:

arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
for d in "${arr[@]}"; do
    if [ -d "$d"]; then
        echo True
    else
        echo False
    fi
done

这是巴什。更便携的是Sh。在那里你可以使用位置数组:

set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"

然后循环使用"$@".

答案4

根据问题,有两个可移植 shell 函数测试多个目录是否存在:

# Returns success if all given arguments exists and are directories.
ck_dir_exists () {
    for dir do
        [ -d "$dir" ] || return 1
    done
}

# Returns success if none of the given arguments are existing directories.
ck_dir_notexists () {
    for dir do
        [ ! -d "$dir" ] || return 1
    done
}

例子:

$ mkdir dir1 dir2
$ ck_dir_exists dir1 dir2; echo $?
0
$ ck_dir_exists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir3 dir4; echo $?
0

相关内容