我正在编写一个在AIX上的KornShell(ksh)下运行的shell脚本。我想使用mkdir命令创建一个目录。但是目录可能已经存在,在这种情况下我不想做任何事情。因此,我想要么测试目录是否不存在,要么抑制mkdir在尝试创建现有目录时抛出的“File exists”错误。

我怎样才能做到最好?


当前回答

这应该是有效的:

$ mkdir -p dir

or:

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

如果目录不存在,它将创建该目录,但如果您尝试创建的目录名称已被其他目录使用,则会发出警告。

其他回答

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

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

-e是KornShell的存在测试。

你也可以尝试在谷歌上搜索KornShell手册。

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

例子:

mkdir -p foo

这将仅在名为“foo”的目录不存在时创建该目录。:)

尝试mkdir-p:

mkdir -p foo

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

mkdir -p foo/bar/baz

将创建目录foo、foo/bar和foo/bar/baz(如果它们不存在)。

一些实现(如GNU mkdir)包括mkdir--父代作为更可读的别名,但这在POSIX/Single Unix规范中没有指定,在许多常见平台(如macOS、各种BSD和各种商业Unix)上也不可用,因此应避免使用。

如果您希望在父目录不存在时出现错误,并且希望在不存在的情况下创建目录,则可以先测试目录的存在:

[ -d foo ] || mkdir foo

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

[ -d newdir ] || mkdir newdir

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

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
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