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

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

技术背景

在Shell脚本编程中,经常需要创建目录。但在创建之前,需要确保该目录不存在,以避免覆盖或产生错误。同时,可能还需要处理父目录不存在的情况。

实现步骤

使用 mkdir -p 命令

mkdir -p 命令可以创建目录及其所有必要的父目录,如果目录已经存在,不会产生错误。

1
mkdir -p foo

如果要创建多层目录,例如 foo/bar/baz,可以使用:

1
mkdir -p foo/bar/baz

需要注意的是,mkdir --parentsmkdir -p 的一个更易读的别名,但不是POSIX标准规定的,在很多常见平台(如macOS、各种BSD和商业Unix系统)上不可用,应避免使用。

先检查目录是否存在

如果希望在父目录不存在时产生错误,并且仅在目录不存在时创建,可以先使用 test 命令检查目录是否存在:

1
[ -d foo ] || mkdir foo

自定义错误处理

如果要创建的目录名已经被其他非目录的东西占用,希望得到警告,可以使用以下代码:

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

定义复杂目录树

可以使用 mkdir -p 结合花括号语法来一次性定义复杂的目录树:

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

不显示错误信息

如果不想显示任何错误信息,可以使用:

1
[ -d newdir ] || mkdir newdir

如果想显示自定义的错误信息,可以使用:

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

在Windows系统上的处理

在Windows 8+系统上,mkdir 不再支持 -p 开关,可以使用以下命令:

1
IF NOT EXIST dir_name MKDIR dir_name

使用函数创建目录

可以编写一个简单的Bash函数来创建目录:

1
2
3
createDirectory() {
mkdir -p -- "$1"
}

调用示例:

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

处理符号链接情况

为了处理指向目录的符号链接情况,可以使用以下改进的命令:

1
[ -d foo/. ] || mkdir foo

核心代码

以下是几种常见情况的核心代码示例:

简单创建目录

1
mkdir -p foo

先检查再创建

1
2
3
4
5
if [ ! -d $dir ]; then
mkdir $dir
else
echo "Directory exists"
fi

自定义错误处理

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

最佳实践

  • 优先使用 mkdir -p 命令,因为它可以处理多层目录的创建,并且在目录已经存在时不会报错。
  • 在脚本中使用 mkdir -p 可以避免手动检查每个父目录是否存在。
  • 如果需要自定义错误处理,使用 if 语句结合 test 命令来检查目录是否存在。

常见问题

  • mkdir --parents 不可用:如前所述,mkdir --parents 不是POSIX标准规定的,在很多平台上不可用,应使用 mkdir -p 代替。
  • Windows系统兼容性问题:Windows 8+系统上 mkdir 不支持 -p 开关,需要使用 IF NOT EXIST 语句。

如何仅在目录不存在时创建目录
https://119291.xyz/posts/2025-05-12.how-to-mkdir-only-if-directory-not-exist/
作者
ww
发布于
2025年5月12日
许可协议