如何使用Bash创建一个文件夹(目录),如果它不存在的话?

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

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


4
为什么你们要用分号? - ADTC
2
; 符号是命令分隔符,换行符也是。由于 then 是一个单独的命令,因此需要前面的分号才能将其写在同一行中。mkdirfi 后面的分号是多余的。 - Andreas Riedmüller
7个回答

396
首先,在Bash中,[只是一个命令,它期望字符串]作为最后一个参数,因此,关闭括号前的空格(以及-d之间需要分别作为两个参数的空格)是重要的
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

其次,由于您正在使用-p开关来创建目录,因此这个检查是无用的,因为这正是它首先要做的事情。只需编写:

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

就是这样。


6
注意:-p 标志将在需要时创建任何父目录。 - Danijel
57
我的天啊,我从来不知道“[”是一个命令。这解释了我遇到的很多问题……这是我在StackOverflow上读过的最有用的东西。 - Ben Kushigian
10
哇!知道 "[" 是 bash 中的一个命令真是大开眼界。我感觉我的许多 bash 脚本问题现在都解决了! - raluru
3
发现“ [ ”是一个命令,真是太惊人了!这让我之前不明白的很多事情一下子豁然开朗。谢谢! - Matt Zabojnik
如何使用正则表达式来识别文件夹?例如:if [ ! -d /home/mlzboy/b2*/shared/db ]; - Jagadeesan G
显示剩余2条评论

127

实际上无需检查其是否存在。由于您想要在它存在的情况下创建它,只需要使用mkdir即可。

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

5
注意:使用-p标志会在必要时创建任何父目录。 - Danijel

95

只需这样做:

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

如果文件夹已经存在,mkdir将会抛出一个错误。如果想要忽略这些错误,请输入以下命令:

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

不需要进行任何检查或其他操作。


参考:

-p, --parents 如果存在则不报错,如有需要则创建父目录 http://man7.org/linux/man-pages/man1/mkdir.1.html


8
参数“-p”并不完全忽略错误:它会调用另一种模式,在该模式下,任何不存在的路径组件都将被创建(因此如果需要创建零个组件,则不会出错)。这种行为与常规模式不同,因为它会创建除最后一个组件之外的其他组件,这可能是有意或无意的。 - BeeOnRope

29
你需要在 [] 括号内加入空格:
#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

20

更简洁的方式,利用Shell逻辑运算符的快捷判断。当左侧为true时,才会执行右侧操作。

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

14
嗯,不是更干净,只是更短。 如果你看到这样的陈述,很难理解它的意思。 - Davide Orazio Montersino
1
我喜欢这个,尽管 -p 参数使检查变得不必要。当你不想自动创建所有父目录时,你仍然可以使用它,也就是说,当你不想使用 -p 时。 - ADTC
4
实际上,要更简洁的写法是[ -d /path/to/dir ] || mkdir /path/to/dir,当左边为假时执行右边的操作。 - ADTC

5

我认为您需要稍微调整一下您的代码格式:

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

0

在任何地方创建您的目录

OUTPUT_DIR=任何内容

if [ ! -d ${OUTPUT_DIR} ]
then
    mkdir -p ${OUTPUT_DIR}
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接