如何仅在目录不存在时创建mkdir?

2861

我正在编写一个可在AIX上的KornShell(ksh)下运行的shell脚本。我想使用mkdir命令来创建目录。但是,如果该目录已经存在,则我不想执行任何操作。因此,我要么测试该目录是否不存在,要么抑制mkdir尝试创建现有目录时引发的“文件已存在”错误。

我应该如何最好地做到这一点?

17个回答

15
directory_name = "foo"

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

15

这是一个简单的函数(Bash shell),可以让你在目录不存在时创建目录。

#------------------------------------------#
# Create a directory if it does not exist. #
#------------------------------------------#
# Note the "-p" option in the mkdir        #
# command which creates directories        #
# recursively.                             #
#------------------------------------------#
createDirectory() {
   mkdir -p -- "$1"
}

您可以按以下方式调用上述函数:

createDirectory "$(mktemp -d dir-example.XXXXX)/fooDir/BarDir"

上述命令将创建fooDir和BarDir(如果它们不存在)。请注意,mkdir命令中的“-p”选项会递归地创建目录。


12

或者,如果您想先检查是否存在:

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

-e 是用于 KornShell 的存在测试。

您也可以尝试搜索 KornShell 手册。


11

参考man mkdir手册中关于选项-p的说明。

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

如果存在将创建给定路径中的所有目录,否则会从左到右创建给定路径中的所有目录。尝试下面的命令。在发出此命令之前,目录newdiranotherdir不存在。

正确用法

mkdir -p /tmp/newdir/anotherdir

执行该命令后,您可以看到newdiranotherdir在/tmp下创建。您可以随时多次使用此命令,该命令始终具有exit(0)。因此,大多数人在在实际使用这些路径之前在shell脚本中使用此命令。


9

对经典解决方案(由Brian Campbell提供)进行改进-以处理指向目录的符号链接的情况。

[ -d foo/. ] || mkdir foo

5
mkdir -p sam
  • mkdir = 创建目录
  • -p = --parents
  • (如果存在则不报错,必要时创建父级目录)

3
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

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