仅当目录在 Linux 中不存在时才创建

要在 Linux 中创建目录,请使用 mkdir 命令。 毕竟它代表“制作目录”。 这是一个非常简单的命令。

但是,当您尝试创建一个已经存在的目录时,您会收到如下错误:

$ mkdir dir0
mkdir: cannot create directory ‘dir0’: File exists

这表明如果一个目录已经存在,mkdir 命令将不会尝试以任何方式创建或修改已经存在的目录。

但它也显示了一个错误,这不是您一直想要的,特别是如果您正在编写 bash 脚本。

为防止出现此错误,请使用 -p 旗连同 mkdir 命令。

mkdir -p dirname

这样,虽然没有创建目录,但它也不会显示任何错误。 您的脚本将照常运行。

?如果存在与您尝试创建的目录同名的文件或链接,您将收到相同的错误。 为什么? 因为在 Linux 中一切都是文件。 目录是一个特殊文件,它的作用类似于其中所有文件的索引。

让我们在这里更详细地了解一下事情,并讨论防止此错误的各种方法。

方法一:使用’-p’选项

如果您查看 mkdir 命令的联机帮助页,它具有“-p”标志。

在 mkdir 中使用 ‘-p’ 标志是“如果存在则没有错误,根据需要创建父目录”。

当您使用’-p’ 标志时,mkdir 实用程序将检查同名的目录、文件、链接或管道是否不存在。

如果确实存在,它不会修改您现有的目录或文件,也不会显示错误消息。

mkdir -p dirname

没有输出,因为不存在

这在您创建自定义时非常方便 bash 脚本并且不希望它的执行因为这个错误而停止。

-p 也可用于创建嵌套目录结构。 如果要创建类似 dir1/dir2/dir3 的目录结构,并且层次结构中存在一些目录或没有目录。

方法2:检查目录是否已经存在 bash

如果你正在写作 bash 脚本,您可以使用 if 条件并检查目录是否已存在。 如果没有,则创建目录。

这是一个示例代码:

if [ -d my_dir ]
then
    mkdir my_dir
fi

方法三:发送到虚空

大多数 UNIX 工具都有两个输出流,stdout 和 stderr。 通常,流、stdout 和 stderr 都会打印到终端。 但是您可以将正常输出流或错误流重定向到另一个文件。

因此,当 mkdir 命令向您的终端抛出错误时,您可以将其重定向到 void。

要重定向标准输出,请将其与“1”数字流描述符一起使用,对于标准错误,请使用数字流描述符“2”。 您还可以使用“0”流描述符重定向标准输入。

要实际重定向输出,请使用适当的流描述符以及重定向运算符“>”

$ mkdir dir0 2> /dev/null

这会将 stderr 的输出发送到“/dev/null”设备,该设备会丢弃写入其中的任何内容。

这是完全安全的。 如前所述,如果目录已经存在,则不会对其进行修改。 只会显示错误消息。 您在这里所做的只是抑制该错误消息。

就个人而言,我会采用第一种方法,即使用 mkdir -p 用于确保仅在同一位置没有同名文件或目录时才创建目录的命令。