dirがまだ存在しない場合にのみmkdirする方法は?


1987

AIXのKornShell(ksh)で実行するシェルスクリプトを書いています。mkdirコマンドを使用してディレクトリを作成したいと思います。しかし、ディレクトリがすでに存在している可能性があります。その場合、私は何もしたくありません。そのため、ディレクトリが存在しないことをテストするかmkdir、既存のディレクトリを作成しようとしたときにスローされる「ファイルが存在します」エラーを抑制します。

これを行うための最善の方法についての考えはありますか?

回答:


3294

試してくださいmkdir -p

mkdir -p foo

これにより、存在しない中間ディレクトリも作成されることに注意してください。例えば、

mkdir -p foo/bar/baz

ディレクトリを作成しますfoofoo/barfoo/bar/baz彼らが存在しない場合。

GNUのような一部の実装にmkdirmkdir --parents、より読みやすいエイリアスが含まれていますが、これはPOSIX / Single Unix Specificationで指定されておらず、macOS、さまざまなBSD、さまざまな商用Unixなどの多くの一般的なプラットフォームでは使用できないため、避ける必要があります。

親ディレクトリが存在しないときにエラーが必要で、存在しない場合にディレクトリを作成したい場合testは、最初にディレクトリの存在を確認できます。

[ -d foo ] || mkdir foo

11
あなたが使用する短縮された例は、まさにあなたがしてはいけないことです。ロジックを逆にしてコーディングスペースを節約していますが、使用する必要があります!と&&とそれを読んでいる人にはもっと意味があります
マイクQ

16
@AndreasLarsenこの質問はmkdir、Windowsではなく、Unixライクなシステムに関するものです。-pPOSIX / Single Unix Specification準拠には必須なので、これらの仕様に準拠することを意図したものなら何でもサポートされ-pます。CygwinやMSYSなどのPOSIXエミュレーションレイヤーを使用しない限り、Windowsはまったく異なります。
ブライアンキャンベル

22
今日、mkdir -pで面白いものを発見しました。括弧を使用できます!{}コマンドで「複雑な」ディレクトリツリーを作成します。ここを参照してください:technosophos.com/2010/04/15/...
エルベ

12
@MikeQ 行全体が正しい終了ステータスを持っているので、私は||代わりに好み&&ます。シェルが一緒に実行されるerrexit場合、またはその行が関数、スイッチケースなどの最後の行である場合は重要です。
rudimeier 2016年

9
@herveそれは何の関係もありませんmkdir。シェルは、そのような式を、に渡される引数の離散リストに展開しますmkdir
chepner 2017年

176

これはうまくいくはずです:

$ mkdir -p dir

または:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

存在しない場合はディレクトリを作成しますが、作成しようとしているディレクトリの名前がディレクトリ以外ですでに使用されている場合は警告します。


kornには-d演算子はないと思います。-eは両方のファイル/ディレクトリに使用され、存在を確認するだけです。また、成功するとすべて0を返すので、!冗長です。私が間違っていたら訂正してください。
alkar 2009

1
AFAIK、両方の点で間違っています。テストは成功するとtrueを返し、-dも存在します(少なくともMacOS Xでは)
Alnitak

5
これはスレッドセーフではないことに言及する価値があるかもしれません。ディレクトリが存在するかどうかを確認してから書き込みを行うまでの間に、状況が変わる可能性があります。
ジャスティンL.


73

1つのコマンドで複雑なディレクトリツリーを定義する

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

存在する場合はエラーなし、必要に応じて親ディレクトリを作成
Fedir RYKHTIK

18
これはmkdirそれ自体の機能ではなく、コマンドを実行するシェルであることに注意してください。これはブレース拡張と呼ばれます-AFAIK、Bash、ksh、zsh、およびCシェルのみがサポートします。
Daniel Kamil Kozar、2016年

3
カンマの周りにスペースがあると、予期しない結果になる可能性があります。注意してください。
Atlas7 2017年

1
@ Atlas7によると、通常は正規表現の一部である文字をエスケープする必要があります。(つまり、使用folder nameする代わりにを使用する必要がありますfolder\ name
John Hamilton

1
これは答えではありません。これは、コメントとしてより適切な別のトピックです。
Chris Page

40

エラーメッセージを表示したくない場合:

[ -d newdir ] || mkdir newdir

独自のエラーメッセージを表示する場合:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20

古い試みと真実

mkdir /tmp/qq >/dev/null 2>&1

他の多くのソリューションが持っている競合状態のどれもなしに、あなたが望むことをします。

場合によっては、最も単純な(そして最も醜い)ソリューションが最適です。


5
「tmp」が存在しない場合、これは失敗します。また、確認も行いません。
マイクQ

15

mkdir fooディレクトリが存在する場合でも機能します。「foo」という名前のディレクトリが存在しない場合にのみ機能させるには、-pフラグを使用してみてください。

例:-

mkdir -p foo

これにより、「foo」という名前のディレクトリが存在しない場合にのみ作成されます。:)


2
@BrianCampbellが述べたように、これによりパス内に他のディレクトリも作成されます。これは、たとえばボリュームがマウント解除された場合、マウントポイントにディレクトリを作成する可能性があるため危険です。
公証人2015

11
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

10

または、最初に存在を確認する場合:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-eは、Kornシェルの存在テストです。

Kornシェルのマニュアルをグーグルで試すこともできます。


10

mkdirは、Windows 8以降のシステムでは-pスイッチをサポートしなくなりました。

あなたはこれを使うことができます:

IF NOT EXIST dir_name MKDIR dir_name

10
OPはAIX kornshellに関するものでした... Windowsとは何の関係もありませんか?
J.チョメル2017

9

man mkdirオプションのマニュアルページを参照-p

   -p, --parents
          no error if existing, make parent directories as needed

指定されたパスにすべてのディレクトリを作成します。存在する場合はエラーをスローしません。それ以外の場合は、指定されたパスに左から右にすべてのディレクトリを作成します。以下のコマンドを試してください。ディレクトリでnewdirあり、anotherdirこのコマンドを発行する前に存在しません

正しい使い方

mkdir -p /tmp/newdir/anotherdir

コマンドを実行すると、/ tmpの下に表示されnewdiranotherdir作成されます。このコマンドは何度でも発行できますexit(0)。コマンドは常にです。このため、ほとんどの人は、実際のパスを使用する前に、このコマンドをシェルスクリプトで使用します。


8

ifループを使用して、ディレクトリが存在するかどうかを確認できます。存在しない場合は、ディレクトリを作成するよりも存在しないかどうかを確認できます。

1)dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2)-pオプションを指定したmkdirを使用してディレクトリを作成し、ディレクトリを作成できます。ディレクトリが使用できないかどうかを確認します。

mkdir -p $dir

mkdir -pを使用すると、ディレクトリのツリー構造を作成することもできます。同じコマンドを使用して親ディレクトリと子ディレクトリを作成する場合は、mkdir -pを選択できます

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

ifループを使用する利点はありますか?なぜ誰かが-pオプションよりもそれを選ぶのですか?
pedram bashiri

1
フォルダーが存在しない場合にフォルダーを作成する方法を共有しました。それは、1つの要件に依存します。フォルダーが存在しないかどうかを確認する必要があるユースケースがあり、それを追跡してソリューション1に進むことができる場合、問題がなければソリューション2に進むことができ、フォルダーが作成されます存在しない場合。
AbhinavVaidya8 2018

ループが見えませんでした。
アミットNaidu

3

これは、存在しない場合にディレクトリを作成できる単純な関数(bashシェル)です。

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

上記の関数は次のように呼び出すことができます。

createDirectory / tmp / fooDir / BarDir

上記はfooDirとBarDirが存在しない場合は作成します。ディレクトリを再帰的に作成するmkdirコマンドの「-p」オプションに注意してください。お役に立てれば。


2
mkdir -p sam
  • mkdir =ディレクトリを作成
  • -p = --parents
  • (存在する場合はエラーなし、必要に応じて親ディレクトリを作成します)

2
if [ !-d $dirName ];then
     if ! mkdir $dirName; then  # Shorter version. Shell will complain if you put braces here though
     echo "Can't make dir: $dirName"
     fi
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.