私が見落としているlinuxコマンドで、以下のようなことができるものはありますか? (疑似)。)
$ mkdir -R foo/bar/zoo/andsoforth
それとも、ディレクトリを1つずつ作っていくしかないのでしょうか?
mkdir -p`を使用することは、最近のほとんどのOSでは簡単な方法です。
mkdir -p foo/bar/zoo/andsoforth
しかし、多くのマニュアルでは mkdir -p
は推奨されていません。mkdir -pを使った場合の問題点については、GNU
makeや
autoconf`のドキュメントを読んでください。
クロスプラットフォームのインストールおよび設定システムには、mkdir -p
に対する独自の安全な代替手段があります。
シェルのコマンドラインで使用するCMake:。
cmake -E make_directory foo/bar/zoo/andsoforth
スクリプトで前処理を行うためのAutoconf:{{112328}}。
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
}
このスクリプトは、mkdir
のオプション -p
が存在しない古いシステムに使用することができます。
sed
ベースのクロスプラットフォーム版 dirname
がコードに追加されました。これは dirname
と同様の方法で動作します (パス /
で正しい、ベースネームのみのパス、末尾に /
を持つパス、末尾に n
を持つパスと持たないパス)。この関数は、パスに改行があったり、現在のロケールで無効な文字があったりすると、正しく動作しません。また、/
(//
, ///
) の任意の組み合わせを単一の /
に置き換えます。
なぜなら、mkdir
はパスが存在するとエラーで終了し、aaa\.
のような構造を含むパスにはこのチェックが必要だからです(aaa
が存在しない場合、前バージョンではaaa
を作成し、再度作成しようとします)。
このバージョンのmkdは、パスが既に存在する場合にエラーを発生させず(ただし、並列実行時にはそのようなエラーを発生させる可能性があります)、コマンドラインで複数のディレクトリを取得することができません。
mkdir foo foo/bar foo/bar/zoo/ foo/bar/zoo/andsofort.
これで大丈夫でしょう。