dir1
作業ディレクトリに、など、複数のディレクトリが存在することを確認したいと思いますdir2
。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
ユーティリティの終了コードを使用して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