Bashはディレクトリが存在することを確認します。配列を使用して作成されなかった場合

Bashはディレクトリが存在することを確認します。配列を使用して作成されなかった場合

配列に格納されているすべてのディレクトリが存在することを確認する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/path3Linuxやシェルスクリプトを学ぶだけの人には、これがまさにあなたが探しているものではないかもしれないことを指摘したいと思います。スクリプトに、およびを追加することをお勧め
します。chownchmodsort

/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 )

これにより、上位ディレクトリが下位ディレクトリの前に表示されます。

次に変更したいのは-mforパターンです。これにより、必要な権限がディレクトリに設定されます。
mkdir -m ${mode} ${dir}

所有者とグループを設定します(特にrootとして実行している場合)。 GroupAとGroupBのメンバーである場合、mkdirコマンドはグループ所有者をデフォルトグループ(コマンドに表示される最初のグループid)に設定します。したがって: [[ ! -d "$dir" ]] && mkdir -m ${mode} "$dir" && chown ${user}:${group} "${dir}"

関連情報