まだ存在しない場合、Bashを使用してフォルダーを作成する方法


179
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

これは機能していないようです。誰か助けてもらえますか?


4
なぜセミコロンがあるのですか?
ADTC 2016

1
;トークンは、コマンドの区切りなので、改行です。ようにthen別のコマンドであり、前述のセミコロンは、同じ行に書き込むことができるようする必要があります。セミコロンの後mkdirfi余分です。
AndreasRiedmüller18年

回答:


278

まず、bashでは "["は単なるコマンドであり、最後の引数として文字列 "]"を想定しているため、右角かっこの前の空白(および "!"と "-d"の間の2つの個別の引数である必要があります)も)重要です:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

次に、-pスイッチをmkdirに使用しているので、このチェックは何の役にも立ちません。書くだけ:

mkdir -p /home/mlzboy/b2c2/shared/db;

以上です。


2
注:この-pフラグにより​​、必要に応じて親ディレクトリが作成されます。
Danijel

13
私の神、私は "["がコマンドであることを知りませんでした。これは私の問題の多くを説明しています... StackOverflowでこれまでに読んだ中で最も簡単なものは簡単です。
ベンクシギアン2018年

1
うわー!"["がbashのコマンドであることを知ることは、とても目を見張るものです。私のbashスクリプトに関する多くの問題が解決されたような気がします!
raluru

93

実際に存在するかどうかを確認する必要はありません。存在する場合はすでに作成したいので、mkdirだけで実行できます

mkdir -p /home/mlzboy/b2c2/shared/db

2
注:この-pフラグにより​​、必要に応じて親ディレクトリが作成されます。
Danijel

67

単に行います:

mkdir /path/to/your/potentially/existing/folder

フォルダーが既に存在する場合、mkdirはエラーをスローします。エラーを無視するには、次のように記述します。

mkdir -p /path/to/your/potentially/existing/folder

チェックなどをする必要はありません。


参考のため:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


3
引数-pはエラーを正確に無視しません。存在しないパスコンポーネントが作成される別のモードを呼び出します(したがって、ゼロを作成する必要がある場合でもエラーではありません)。最後のコンポーネント以外のコンポーネントが作成されるため、動作は異なります。
BeeOnRope

23

[]括弧の中にスペースが必要です:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

18

よりクリーンな方法は、シェルの論理演算子のショートカット評価を利用することです。演算子の右側は、左側がtrueの場合にのみ実行されます。

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
mmh、きれいではない:ちょうど短い。このような発言に出会った場合、その意味を理解することは困難です。
Davide Orazio Montersino 2014

1
-p引数はチェックが不要になるが、私はこれが好きです。あなたが使用しないときは、まだそれを使用することができます-pあなたがする場合であること、したくないすべての親ディレクトリが自動的に作成されます。
ADTC

3
実際に書く[ -d /path/to/dir ] || mkdir /path/to/dirとさらに短くなります..左側が偽のときに右側が実行されます。
ADTC

4

コードを少し再フォーマットする必要があると思います。

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.