试试 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。它被称为大括号扩展 - AFAIK,只有 Bash、ksh、zsh 和 C shell 支持它。
folder\ name
而不是使用 folder name
)
如果您不想显示任何错误消息:
[ -d newdir ] || mkdir newdir
如果你想显示你自己的错误信息:
[ -d newdir ] && echo "Directory Exists" || mkdir newdir
mkdir -p
。但是您不会显示自己的 Directory exists
错误。
即使目录存在,mkdir foo
也能正常工作。要使其仅在名为“foo”的目录不存在时才起作用,请尝试使用 -p
标志。
例子:
mkdir -p foo
只有当它不存在时,才会创建名为“foo”的目录。 :)
旧的尝试和真实
mkdir /tmp/qq >/dev/null 2>&1
将在许多其他解决方案都没有的竞争条件下做你想做的事。
有时最简单(也是最丑陋)的解决方案是最好的。
[ -d newdir ] || mkdir newdir
这样的片段,其中目录最初不存在,有一个竞争条件,在存在测试和尝试创建之间,另一个进程可以突然进入并创建目录。因此 mkdir
将失败。
/tmp
来表示始终存在并且对当前用户可写的基本路径,例如,用户有足够的权限在其中创建目录。您提出一个有效的观点::逻辑有点矛盾,因为当这个命令失败时,它可能意味着两件事:1.)目录存在或2.)目录无法创建。这不适用于操作本身,因此对目录路径进行简单的后检查可以给出确认,或者下一个操作的命令。
mkdir -p /tmp/qq > /dev/null 2>&1
将创建 /tmp/ 如果缺少。
您可以使用 if
语句来检查目录是否存在。如果它不退出,则创建目录。
dir=/home/dir_name 如果 [ ! -d $dir ] 然后 mkdir $dir else echo "Directory exists" fi 您可以使用带有 -p 选项的 mkdir 来创建目录。它将检查目录是否不可用。 mkdir -p $dir mkdir -p 还允许创建目录的树结构。如果要使用相同的命令创建父目录和子目录,可以选择 mkdir -p mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
mkdir 在 Windows 8+ 系统上不再支持 -p 开关。
你可以使用这个:
IF NOT EXIST dir_name MKDIR dir_name
directory_name = "foo"
if [ -d $directory_name ]
then
echo "Directory already exists"
else
mkdir $directory_name
fi
简单、沉默和致命:
mkdir -p /my/new/dir >/dev/null 2>&1
my/new/dir
已经存在,mkdir -p my/new/dir
不会抱怨,无需重定向输出
-p
在 Windows 上仍然失败
这是一个简单的函数(Bash shell),如果它不存在,它可以让您创建一个目录。
#------------------------------------------#
# Create a directory if it does not exist. #
#------------------------------------------#
# Note the "-p" option in the mkdir #
# command which creates directories #
# recursively. #
#------------------------------------------#
createDirectory() {
mkdir -p -- "$1"
}
您可以将上述函数调用为:
createDirectory "$(mktemp -d dir-example.XXXXX)/fooDir/BarDir"
如果 fooDir 和 BarDir 不存在,则以上创建它们。注意 mkdir 命令中的“-p”选项,它递归地创建目录。
参考手册页 man mkdir
的选项 -p
-p, --parents
no error if existing, make parent directories as needed
它将在给定路径中创建所有目录,如果存在则不会引发错误,否则它将在给定路径中从左到右创建所有目录。试试下面的命令。在发出此命令之前目录 newdir
和 anotherdir
不存在
正确使用
mkdir -p /tmp/newdir/anotherdir
执行命令后,您可以看到在 /tmp 下创建的 newdir
和 anotherdir
。您可以根据需要多次发出此命令,该命令始终具有 exit(0)
。由于这个原因,大多数人在使用这些实际路径之前在 shell 脚本中使用此命令。
或者,如果您想先检查是否存在:
if [[ ! -e /path/to/newdir ]]; then
mkdir /path/to/newdir
fi
-e 是 KornShell 的存在测试。
您也可以尝试使用谷歌搜索 KornShell 手册。
mkdir -p sam
mkdir = 创建目录
-p = --父母
(如果存在则没有错误,根据需要创建父目录)
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
mkdir
的,而不是 Windows 上的。-p
是 POSIX/单一 Unix 规范合规性所必需的,因此任何旨在遵守这些规范的东西都将支持-p
。 Windows 是完全不同的,除非您使用像 Cygwin 或 MSYS 这样的 POSIX 仿真层。mkdir -p
发现了一些有趣的东西,你可以使用括号!{}
在命令中创建“复杂”目录树。见这里:technosophos.com/2010/04/15/…||
而不是&&
因为这样整行就有正确的退出状态。如果您的 shell 使用errexit
运行,或者该行是函数、switch-case 等中的最后一行,则很重要。mkdir
无关; shell 将这样的表达式扩展为传递给mkdir
的离散参数列表。