私が見落としているLinuxコマンドはありますか?それは次の行に沿って何かを行うことを可能にします:(疑似)
$ mkdir -R foo/bar/Zoo/andsoforth
または、ディレクトリを1つずつ作成する以外に方法はありませんか?
$ mkdir -p foo/bar/Zoo/andsoforth
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
}
このスクリプトは、mkdir
のオプション-p
が存在しない古いシステムで使用できます。
sed
ベースのクロスプラットフォームバージョンのdirname
がコードに追加されました。 dirname
と同様に機能します(パス/
で正しいパス、ベース名のみのパス、末尾に/
があるパス、末尾に\n
sがあるパスとないパス)。この関数は、パスに現在のロケールで改行または無効な文字が含まれている場合は正しく機能しません。また、/
(//
、///
)の任意の組み合わせを単一の/
に置き換えます
mkdir "$1" || return 1
をtest -d "$1" || { mkdir "$1" || return 1; }
に変更しました。パスが存在する場合、mkdir
はエラーで終了し、このチェックはaaa\.
のような構造を含むパスに必要です(aaa
が存在する場合存在しない以前のバージョンはaaa
を作成してから、もう一度作成しようとします)。
このバージョンのmkdは、パスがすでに存在する場合でもエラーを生成しません(ただし、並列実行でそのようなエラーを生成する可能性があります)。コマンドラインでいくつかのディレクトリを取得できません。
オプション-p
inコマンドmkdir
は、必要に応じてp arentディレクトリを作成します(既存の場合はエラーなし):
mkdir -p foo/bar/Zoo/andsoforth
別の方法は、たとえば&&
(指定したフォルダーが存在する場合はエラー):
mkdir foo && mkdir foo/bar && mkdir foo/bar/Zoo && mkdir foo/bar/Zoo/andsoforth
連鎖演算子&&
は、前のコマンドがエラーなしで終了した場合にのみ次のコマンドが実行されるように、コマンドをチェーンするために使用されます。
もちろん、最初の方法の方が優れています。