2485

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

我怎样才能最好地做到这一点?

4

16 回答 16

4084

尝试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
于 2009-04-27T14:49:46.437 回答
217

这应该有效:

$ 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

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

于 2009-04-27T14:50:40.770 回答
105

使用 -p 标志。

man mkdir
mkdir -p foo
于 2009-04-27T14:50:09.103 回答
83

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

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
于 2013-08-21T20:08:57.050 回答
49

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

[ -d newdir ] || mkdir newdir

如果你想显示你自己的错误信息:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
于 2015-03-27T03:57:44.200 回答
26

旧的尝试和真实

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

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

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

于 2009-04-27T15:00:50.370 回答
26

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

例子:

mkdir -p foo

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

于 2014-01-20T12:23:42.743 回答
17

您可以使用if语句来检查目录是否存在。如果它不退出,则创建目录。

  1. dir=/home/dir_name

    if [ ! -d $dir ]
    then
         mkdir $dir
    else
         echo "Directory exists"
    fi
    
  2. 您可以使用带有 -p 选项的 mkdir 来创建目录。它将检查目录是否不可用。

    mkdir -p $dir
    

    mkdir -p 还允许创建目录的树结构。如果要使用相同的命令创建父目录和子目录,可以选择 mkdir -p

    mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
    
于 2018-08-21T04:56:21.290 回答
15

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

你可以使用这个:

IF NOT EXIST dir_name MKDIR dir_name
于 2016-11-22T12:39:41.660 回答
14
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi
于 2015-12-16T11:34:59.323 回答
10

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

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

-eKornShell的存在测试。

您也可以尝试使用谷歌搜索 KornShell 手册。

于 2009-04-27T14:51:20.910 回答
10

这是一个简单的函数(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”选项,它递归地创建目录。

于 2018-02-14T18:54:02.507 回答
10

参考手册页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 脚本中使用此命令。

于 2019-01-21T23:46:57.730 回答
7

简单、沉默和致命:

mkdir -p /my/new/dir >/dev/null 2>&1
于 2020-12-15T16:57:37.053 回答
3
mkdir -p sam
  • mkdir = 创建目录
  • -p = --父母
  • (如果存在则没有错误,根据需要创建父目录)
于 2018-04-20T09:30:55.573 回答
2
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
于 2020-03-15T20:37:56.453 回答