使用mkdir -p
は、ほとんどの最新のOSにとって簡単な方法です。
mkdir -p foo/bar/zoo/andsoforth
ただし、mkdir -p
多くのマニュアルでは推奨されていません。GNUのためにドキュメントを読みmake
やautoconf
使用に問題についてmkdir -p
:
クロスプラットフォームのインストールおよび構成システムには、に対する独自の安全な代替手段がありmkdir -p
ます。
シェルコマンドラインで使用するCMake:
cmake -E make_directory foo/bar/zoo/andsoforth
前処理でスクリプトで使用するAutoconf:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
または:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
ただし、これらのソリューションにはcmake
、autoconf
(M4
)ツールのインストール(および可能な前処理)が必要です
オプションでinstall-sh
スクリプトを使用することもでき-d
ます:
install-sh -d foo/bar/zoo/andsoforth
このスクリプトはautoconf
、automake
プロジェクトで使用されます。私はそれが最も安全な解決策でなければならないと思います。
当時、私は/bin/sh
依存関係のない標準のクロスプラットフォームソリューションを探していましたが、見つかりませんでした。したがって、理想的ではない可能性がある次のスクリプトを作成しましたが、ほとんどのクロスプラットフォーム要件に準拠していると思います。
#! /bin/sh
cdirname() # cross platform alternative for 'dirname'
{
# $1 - path
test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
echo "$1" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}
mkd() # cross platform alternative for 'mkdir -p'
{
# $1 - directory to create
test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
test -d "$1" && return 0
test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
test -d "$1" || { mkdir "$1" || return 1; }
return 0
}
このスクリプトは、オプションで、古いシステム、のために使用することができる-p
ためにはmkdir
存在しません。
sed
のベースのクロスプラットフォームバージョンがdirname
コードに追加されました。dirname
(path /
、ベース名のみのパス、末尾の/
パス、末尾\n
のsのあるパスとないパスで正しい)と同様の方法で動作します。この関数は、パスに現在のロケールの改行または無効な文字が含まれている場合、正しく機能しません。また、/
(//
、///
)の任意の組み合わせを単一の/
パスが存在する場合にエラーで終了mkdir "$1" || return 1
するtest -d "$1" || { mkdir "$1" || return 1; }
ため、行を変更しました(次のmkdir
ような構造を含むパスにこのチェックが必要ですaaa\.
(aaa
以前のバージョンが存在しない場合aaa
、作成してから再度作成しようとします)。
このバージョンのmkdは、パスが既に存在する場合はエラーを生成しません(ただし、並列実行でこのようなエラーを生成する可能性はまだあります)。コマンドラインで複数のディレクトリを取得することはできません。