如果尚不存在,如何使用Bash创建文件夹?


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

这似乎不起作用。有人可以帮忙吗?


4
为什么会有分号?
ADTC '16

1
;令牌是命令分隔符,所以是换行符。作为then单独的命令,需要前面的分号才能将其写在同一行中。mkdir和之后的分号fi是多余的。
安德烈亚斯·里德米勒(AndreasRiedmüller)

Answers:


283

首先,在bash中,“ [”只是一个命令,它期望将字符串“]”作为最后一个参数,因此,右括号之前的空格(以及“!”和“ -d”之间的空格必须是两个单独的参数)也很重要):

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

16
天哪,我从不知道“ [”是命令。这就解释了我的许多问题...轻松地是我在StackOverflow上读过的最有用的东西。
Ben Kushigian

3
哇!知道“ [”是bash中的命令真是大开眼界。我觉得我的bash脚本有很多问题现在已经解决了!
raluru

难以确定“ [”是命令。这让很多事情对我来说都是以前无法理解的。谢谢!
Matt Zabojnik

94

实际上,没有必要检查它是否存在。由于您已经想创建它(如果存在),因此只需mkdir即可

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

2
注意:-p如果需要,该标志将导致创建任何父目录。
Danijel

71

只需做:

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

更干净的方法,利用Shell逻辑运算符的快捷方式评估。仅当左侧为true时,才执行运算符的右侧。

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

11
嗯,不是更干净:只是更短。如果您遇到这样的声明,很难理解它的含义。
Davide Orazio Montersino 2014年

1
我喜欢这样,尽管该-p参数使检查变得不必要。当您不想使用时-p,也就是您不想自动创建所有父目录时,仍可以使用它。
ADTC

3
实际上,写得更短[ -d /path/to/dir ] || mkdir /path/to/dir..如果左侧为false,则执行右侧。
ADTC '16

4

我认为您应该重新格式化代码:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.