检查多个目录的存在

Ele*_*nce 10 shell directory shell-script files control-flow

我想检查工作目录中是否存在多个目录,例如dir1dir2dir3

我有以下

if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
    echo True
else
    echo False
fi
Run Code Online (Sandbox Code Playgroud)

但我怀疑有一种更优雅的方式来做到这一点。不要假设目录名称中存在模式。

目标是检查几个目录的存在和其他目录的不存在。

我正在使用 Bash,但首选可移植代码。

gle*_*man 10

我会循环:

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

break导致循环短路,就像你的链&&


小智 5

循环可能更优雅:

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

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

set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"
Run Code Online (Sandbox Code Playgroud)

然后循环使用它"$@"


Jef*_*ler 5

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

ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there
Run Code Online (Sandbox Code Playgroud)

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

  • (1) 您可能应该使用 `-d` 选项 (a) 所以 `ls` 只需要统计目录,而不是读取它们,并且 (b) 所以即使用户没有读取命令也会成功访问目录。(2) 我看不出有任何理由使用 ```"$PWD/"``` 除了防止名称以 `-` 开头的目录(当然,还有更好的方法来做到这一点)。 (3认同)
  • 与原始问题中的测试相比,此命令的运行时间可能要长得多。它也不检查目录。 (2认同)

Dav*_*rad 5

为什么不只是:

if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
    echo True
else
    echo False
fi
Run Code Online (Sandbox Code Playgroud)

  • POSIX 也不鼓励使用 `-a`:“`-a` 和 `-o` 二进制原色 (...) 运算符已被标记为过时”:http://pubs.opengroup.org/onlinepubs/9699919799/ (6认同)
  • 完全不一样,原始调用`test`(又名`[`)三次,它调用一次, (2认同)