题 如果目录尚不存在,如何mkdir?


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

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


1333
2018-04-27 14:47


起源




答案:


尝试 mkdir -p

mkdir -p foo

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

mkdir -p foo/bar/baz

将创建目录 foofoo/bar,和 foo/bar/baz 如果它们不存在

如果您希望父目录不存在时出错,并且想要创建目录(如果该目录不存在),则可以 test 对于目录的存在,首先:

[ -d foo ] || mkdir foo

2318
2018-04-27 14:49



你使用的缩短的例子正是你不应该做的。它正在扭转逻辑以节省编码空间,但它应该使用!和&&并使阅读它的人更有意义。 - Mike Q
@AndreasLarsen这个问题是关于 mkdir 在类Unix系统上,而不是在Windows上。 -p 是POSIX /单Unix规范合规性所必需的,因此任何符合这些规范的内容都将支持 -p。除非您使用像Cygwin或MSYS这样的POSIX仿真层,否则Windows完全不同。 - Brian Campbell
我今天发现了一些有趣的东西 mkdir -p,你可以使用括号! {} 在命令中创建“复杂”目录树。看这里: technosophos.com/2010/04/15/... - herve
@MikeQ我更喜欢 || 代替 && 因为那时整条线都有正确的退出状态。如果您的shell运行,则很重要 errexit 或者如果该行是函数中的最后一行,则为switch-case,无论如何。 - rudimeier
@herve那与此无关 mkdir; shell将这样的表达式扩展为传递给的参数的离散列表 mkdir。 - chepner


这应该工作:

$ 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

如果目录不存在,它将创建目录,但警告您,您尝试创建的目录的名称是否已被目录以外的其他目录使用。


109
2018-04-27 14:50



我不认为korn中有一个-d运算符,而是-e用于两个文件/目录,只检查存在。此外,他们都成功返回0,所以!是多余的。如我错了请纠正我。 - alkar
这两项都是错误的,AFAIK。测试返回 真正 成功时,-d也存在(至少在MacOS X上) - Alnitak
值得一提的是,这不是线程安全的。在检查目录是否存在以及尝试写入的时间之间,事情可能会发生变化。 - Justin L.


使用-p标志。

man mkdir
mkdir -p foo

70
2018-04-27 14:50





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

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

58
2017-08-21 20:08



如果存在则没有错误,根据需要创建父目录 - Fedir RYKHTIK
请记住,这不是一个功能 mkdir 本身,但执行命令的shell。它被称为大括号扩展--AFAIK,只有Bash,ksh,zsh和C shell支持它。 - Daniel Kamil Kozar
如果你的逗号周围有空格,你可能会(会)获得意想不到的结果。谨防。 - Atlas7
我在bash中试过它,它完美无缺。 - Ada Lovelace
@ Atlas7表示,你需要转义通常属于正则表达式的字符。 (即代替使用 folder name 你需要使用 folder\ name) - John Hamilton


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

[ -d newdir ] || mkdir newdir

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

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

20
2018-03-27 03:57





旧的尝试和真实

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

在没有许多其他解决方案的竞争条件下,你会做你想做的事。

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


17
2018-01-20 12:23



如果“tmp”不存在,这将失败。它也没有给你任何确认。 - Mike Q


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

示例: -

mkdir -p foo

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


10
2017-12-16 11:34



正如@BrianCampbell所提到的,这也将在路径中创建任何其他目录。如果例如这可能是危险的卷已卸载,因为它可能会在挂载点中创建目录。 - uliwitness


directory_name = "foo"

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

9
2018-04-27 14:51





或者如果你想先检查存在:

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

-e 是korn shell的存在测试。

你也可以尝试谷歌搜索korn shell手册。


7
2017-11-22 12:39





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

你可以用这个:

IF NOT EXIST dir_name MKDIR dir_name

2
2018-02-14 18:54



OP是关于AIX kornshell ...与Windows无关,是吗? - J. Chomel
这适用于linux,不适合我 - Abhi


这是一个简单的函数(bash shell),它允许您创建一个目录(如果它不存在)。

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

您可以将上述功能称为:

createDirectory / tmp / fooDir / BarDir

如果它们不存在,上面创建fooDir和BarDir。请注意mkdir命令中的“-p”选项,该选项以递归方式创建目录。希望这可以帮助。


0
2018-04-20 09:30