我正在编写一个可在AIX上的KornShell(ksh)下运行的shell脚本。我想使用mkdir
命令来创建目录。但是,如果该目录已经存在,则我不想执行任何操作。因此,我要么测试该目录是否不存在,要么抑制mkdir
尝试创建现有目录时引发的“文件已存在”错误。
我应该如何最好地做到这一点?
mkdir -p
命令:mkdir -p foo
mkdir -p foo/bar/baz
如果目录不存在,将创建目录foo
,foo/bar
和foo/bar/baz
。
一些实现(如GNU mkdir
)将mkdir --parents
作为更可读的别名,但这在POSIX / Single Unix规范中没有指定,并且在许多常见平台上不可用,例如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}
mkdir
命令本身的特性,而是执行该命令的 shell 的特性。这被称为花括号扩展 - 据我所知,只有 Bash、ksh、zsh 和 C shell 支持它。 - Daniel Kamil Kozarfolder\ name
而不是folder name
) - John Hamilton如果您不想显示任何错误消息:
[ -d newdir ] || mkdir newdir
如果你想展示自己的错误信息:
[ -d newdir ] && echo "Directory Exists" || mkdir newdir
mkdir -p
。但是您将无法显示自己的“目录已存在”错误。 - Jahidmkdir foo
即使目录已经存在也能工作。为了只在名为“foo”的目录不存在时工作,请尝试使用-p
标志。
示例:
mkdir -p foo
只有在目录"foo"不存在的情况下,才会创建该目录。 :)
if
语句来检查目录是否存在。如果不存在,则创建该目录。
dir=/home/dir_name
if [ ! -d $dir ]
then
mkdir $dir
else
echo "目录已存在"
fi
您可以使用mkdir命令的-p选项来创建目录。它将检查目录是否不存在,如果不存在则会创建。
mkdir -p $dir
mkdir -p还允许创建目录的树形结构。如果您想要使用同一命令创建父目录和子目录,则可以选择mkdir -p
mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
简单、无声并且致命:
mkdir -p /my/new/dir >/dev/null 2>&1
my/new/dir
目录已经存在,使用命令 mkdir -p my/new/dir
不会报错,无需重定向输出。 - Leevi Lmkdir -p /parent/dir
会报错吗?如果是这样的话,重定向可能被认为是“致命”的,或者至少是不明智的。 - WGroleau老而经典
mkdir /tmp/qq >/dev/null 2>&1
这个解决方案可以按照您的要求执行,而且没有其他解决方案中存在的竞态条件。
有时候最简单(也可能最丑陋)的解决方案是最好的。
[ -d newdir ] || mkdir newdir
这样的片段,当目录最初不存在时,存在竞争条件。因为在检查存在性和尝试创建之间,另一个进程可能会抢先创建该目录。因此,mkdir
将失败。 - paxdiablomkdir -p /tmp/qq > /dev/null 2>&1
如果不存在,将创建 /tmp/。 - Jesse Nickles在 Windows 8+ 系统上,mkdir 不再支持 -p 开关。
你可以使用以下命令:
IF NOT EXIST dir_name MKDIR dir_name
mkdir
命令,而不是Windows上的。为了符合POSIX/Single Unix规范,使用-p
选项是必须的,因此任何打算遵守这些规范的系统都将支持-p
选项。对于Windows系统来说完全不同,除非你使用像Cygwin或MSYS这样的POSIX仿真层。 - Brian Campbellmkdir -p
的有趣事情,你可以使用花括号{}
在命令中创建“复杂”的目录树。具体内容请见这里:http://technosophos.com/2010/04/15/mkdir-creating-multiple-subdirectories-one-command.html。 - herve||
而不是&&
,因为这样整行命令的退出状态才正确。如果你的shell运行时开启了errexit
或该命令是函数、switch-case等结构的最后一行时,这一点非常重要。 - rudimeiermkdir
无关,shell将这样的表达式扩展为一系列离散的参数,然后传递给mkdir
。 - chepner