配列に格納されているすべてのディレクトリが存在することを確認するBashスクリプトを作成したいと思います。そうでない場合、スクリプトはそれを生成する必要があります。これは正しいアプローチですか?
array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
if [ ! -d “$array1” ]; then
mkdir $array1
else
break
fi
答え1
ちょうど使用:
mkdir -p -- "${array1[@]}"
必要に応じて中間ディレクトリコンポーネントも作成されるため、リーフディレクトリのみを含むように配列を減らすこともできます。
array1=(
/apache/bin
/apache/conf
/apache/lib
/www/html
/www/cgi-bin
/www/ftp
)
次のように書くこともできます。
array1=(
/apache/{bin,conf,lib}
/www/{html,cgi-bin,ftp}
)
[[ -d ... ]] || mkdir ...
一般的に導入されるメソッドの種類TOCTOU競争条件可能であれば避けるのが最善です(たとえこの特別な場合は問題にはなりませんが)。
答え2
配列を繰り返す必要があります。それからbashが提案します。
array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
for dir in "${array1[@]}"; do
[[ ! -d "$dir" ]] && mkdir "$dir"
done
答え3
@darxmurfが提供した答えを拡張したいと思います。
mkdir /path1/path2/path3
Linuxやシェルスクリプトを学ぶだけの人には、これがまさにあなたが探しているものではないかもしれないことを指摘したいと思います。スクリプトに、およびを追加することをお勧め
します。chown
chmod
sort
/path1/path2
存在しない場合は失敗mkdir /path1/path2/path3
します。
これは次のように少し変更することができます。
mkdir -p /path1/path2/path3
この場合、コマンドを実行しているユーザーのUID、GID、およびUMASKを使用して3つのパスがすべて生成されます。ユーザーのUMASKが077の場合、次のように終了できます。
mkdir -m 777 -p /path1/path2/path3
ディレクトリは次のとおりです。
drwx------ /path1
drwx------ /path2
drwxrwxrwx /path3
あなたが望むものではありませんか?
を使用すると、sort
短いパスが最初にソートされます。配列を考えてみてください。
/apache/bin/cache /apache /apache/bin
実際、配列は次のようになりたいです。
/apache /apache/bin /apache/bin/cache
私が提案した最初の変更は次のとおりです。
array=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
array1=$( echo "${array[@]}" | tr ' ' '\n' | sort )
これにより、上位ディレクトリが下位ディレクトリの前に表示されます。
次に変更したいのは-m
forパターンです。これにより、必要な権限がディレクトリに設定されます。
mkdir -m ${mode} ${dir}
所有者とグループを設定します(特にrootとして実行している場合)。 GroupAとGroupBのメンバーである場合、mkdirコマンドはグループ所有者をデフォルトグループ(コマンドに表示される最初のグループid
)に設定します。したがって:
[[ ! -d "$dir" ]] && mkdir -m ${mode} "$dir" && chown ${user}:${group} "${dir}"