再帰的なmkdir


305

私が見落としているLinuxコマンドはありますか?

$ mkdir -R foo/bar/zoo/andsoforth

または、ディレクトリを1つずつ作成する以外に選択肢はありませんか?



1
面白いことに、私はそのページを見ていましたが、子供(左から右)と考えていたため、「親」を見落としていました。

18
ヒント:一部のシェルでは、実行することさえできますmkdir -p foo/{bar,baz}/zoo/andsoforth。非常に便利!
アーロンコプリー

1
以来、または非常に少なくとも、そのようなの別名があるはず-個人的に、私はので、同様のmanページで「親」を見落として、よく、私は旗のように感じる「-r」「再帰」のためにあるべきmkdir唯一の6を持っています合計で文書化されたフラグ。地獄、私はコマンドがデフォルトでディレクトリを再帰的に作成するべきだと感じており、これを望まない場合は、明示的に指定する必要があります。
jbowman

回答:


511
$ mkdir -p foo/bar/zoo/andsoforth

92
FYI -pは、「親」の略で
カール・crott

14
代わりに、他のコマンドと同様に、-rを作成して、すべてのLinuxコマンドの特定のパラメーターを記憶することはできませんでした
Vedmant

2
しかし、mkdir -pクロスプラットフォームではありません、すべてのシェルでは動作しません
РоманКоптев

9
@РоманКоптев mkdir -pPOSIX指定されており、完全に移植可能であることに最も近いものです。シェルスクリプトに期待するものは何ですか?
ワイルドカード

5
@StephanBijzitterうん、これはunixandseではなくunix.seです。:)
EEAA

16

使用mkdir -pは、ほとんどの最新のOSにとって簡単な方法です。

mkdir -p foo/bar/zoo/andsoforth

ただし、mkdir -p多くのマニュアルでは推奨されていません。GNUのためにドキュメントを読みmakeautoconf使用に問題について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)

ただし、これらのソリューションにはcmakeautoconfM4)ツールのインストール(および可能な前処理)が必要です

オプションでinstall-shスクリプトを使用することもでき-dます:

install-sh -d foo/bar/zoo/andsoforth

このスクリプトはautoconfautomakeプロジェクトで使用されます。私はそれが最も安全な解決策でなければならないと思います。

当時、私は/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は、パスが既に存在する場合はエラーを生成しません(ただし、並列実行でこのようなエラーを生成する可能性はまだあります)。コマンドラインで複数のディレクトリを取得することはできません。


4
「mkdir -p」はposixで定義されています。unixやunixライクなバリアントがサポートしていないものは何ですか?(そして、それはシェルビルトインであってはなりませんが、それができなかった理由はないと思います。)pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html
Tim B

5
そのページの一部の情報はわずか15年前のものです。いくつかは古いです。
トーマスディッキー

7
サポートされないシステムは、オプションの終わりを示すユーティリティやサポートをmkdir -p持つには古すぎます(そして、少なくとも数十年前に話しています)。printf--
ステファンシャゼラス16

2
あなたはcdirname間違った答えを与えるだろうfoo/bar//、またはディレクトリ名は、現在のロケールに改行文字、または無効な文字を含みます。
ステファンシャゼル16

2
printfPOSIXシステムでは安全です。POSIXシステムのサポートmkdir -pmkdir -pPOSIXによって何十年も指定されてきました。--80年代前半からSysIIIで始まるAT&Tシステムで広く普及し始めました。printf最初にksh私が信じているビルトインとして現れ、POSIXによって後に指定されましたmkdir -p。一部のPOSIXシェル(pdkshやyashベースなど)にはまだprintf組み込み機能がありません。
ステファンシャゼラス16

0

オプション-pのコマンドでは、mkdir作るpはディレクトリをアレントない、必要に応じて(既存の場合はエラーを):

mkdir -p foo/bar/zoo/andsoforth

別の方法は、たとえば、次を使用することです&&(指定したフォルダーが存在する場合のエラー):

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

連鎖演算子&&は、コマンドを連鎖するために使用され、次のコマンドは、前のコマンドがエラーなしで終了した場合にのみ実行されます。

もちろん、最初の方法の方が優れています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.