仅当目录不存在时才如何 mkdir?

我正在编写一个 Shell 脚本以在 AIX 上的 KornShell(ksh)下运行。我想使用mkdir命令创建目录。但是该目录可能已经存在,在这种情况下,我不想执行任何操作。因此,我想测试该目录不存在,还是抑制mkdir尝试创建现有目录时抛出的 “文件存在” 错误。

关于如何最好地做到这一点的任何想法?

答案

尝试mkdir -p

mkdir -p foo

请注意,这还将创建任何不存在的中间目录。例如,

mkdir -p foo/bar/baz

如果目录foofoo/barfoo/bar/baz不存在,则会创建目录。

诸如 GNU mkdir类的某些实现将mkdir --parents作为更易读的别名,但这未在 POSIX / Single Unix Specification 中指定,并且在 macOS,各种 BSD 和各种商业 Unix 等许多常见平台上均不可用,因此应避免使用它。 。

如果在父目录不存在时想要一个错误,并且在目录不存在时想要创建该目录,则可以首先test目录的存在:

[ -d foo ] || mkdir foo

这应该工作:

$ mkdir -p dir

要么:

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

如果该目录不存在,它将创建一个目录,但是如果您要创建的目录的名称已经被目录以外的其他名称使用,则会发出警告。

使用 - p 标志。

man mkdir
mkdir -p foo

使用一个命令定义复杂的目录树

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

如果您不想显示任何错误消息:

[ -d newdir ] || mkdir newdir

如果要显示自己的错误消息:

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

旧的尝试和真实

mkdir /tmp/qq >/dev/null 2>&1

不会在其他许多解决方案都具备的竞争条件下完成您想要的工作。

有时最简单(最丑陋)的解决方案是最好的。

即使目录存在, mkdir foo可以工作。要使其仅在名为 “foo” 的目录不存在时起作用,请尝试使用-p标志。

例子:-

mkdir -p foo

仅当目录不存在时,才会创建名为 “foo” 的目录。 :)

directory_name = "foo"

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

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

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

-e是对 korn shell 的存在测试。

您也可以尝试使用 Google 搜寻的 Korn Shell 手册。

在 Windows 8 + 系统上,mkdir 不再支持 - p 开关。

您可以使用此:

IF NOT EXIST dir_name MKDIR dir_name