複数のディレクトリがあることを確認する

複数のディレクトリがあることを確認する

dir1作業ディレクトリに、など、複数のディレクトリが存在することを確認したいと思いますdir2dir3

私は以下を持っています

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ユーティリティの終了コードを使用して1つ以上のディレクトリがあることを確認できます。「エラーが発生しました」:

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

質問によると、複数のディレクトリの存在をテストする2つのポータブルシェル関数があります。

# 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

関連情報