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

Spi*_*ams 1784 shell scripting aix ksh mkdir

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

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

Bri*_*ell 3006

试试mkdir -p:

mkdir -p foo
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p foo/bar/baz
Run Code Online (Sandbox Code Playgroud)

将创建目录foo,foo/bar以及foo/bar/baz如果它们不存在.

像GNU这样的一些实现mkdir包含mkdir --parents一个更易读的别名,但这在POSIX/Single Unix Specification中没有规定,并且在许多常见平台上都没有,比如macOS,各种BSD和各种商业Unix,所以应该避免使用它.

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

[ -d foo ] || mkdir foo
Run Code Online (Sandbox Code Playgroud)

  • 我今天用`mkdir -p`发现了一些有趣的东西,你可以使用括号!`{}`在命令中创建"复杂"目录树.请参见:http://technosophos.com/2010/04/15/mkdir-creating-multiple-subdirectories-one-command.html (19认同)
  • @AndreasLarsen这个问题是关于类Unix系统上的`mkdir`,而不是Windows上的问题.符合POSIX/Single Unix规范需要`-p`,因此任何符合这些规范的内容都支持`-p`.除非您使用像Cygwin或MSYS这样的POSIX仿真层,否则Windows完全不同. (14认同)
  • 您使用的缩短示例正是您不应该做的.它正在扭转逻辑以节省编码空间,但它应该使用!和&&并使阅读它的人更有意义. (10认同)
  • @MikeQ我更喜欢```||```而不是```&&```因为那时整条线都有正确的退出状态.重要的是如果你的shell运行```errexit```或者该行是函数中的最后一行,switch-case,等等. (10认同)
  • @herve这与`mkdir`无关; shell将这样的表达式扩展为传递给`mkdir`的离散参数列表. (7认同)
  • 在 Windows8 上似乎不再支持 -p 并且它是默认行为。 (2认同)
  • 你绝对是对的。尽管如此,在这种情况下它确实很强大。 (2认同)

Aln*_*tak 159

这应该工作:

$ mkdir -p dir
Run Code Online (Sandbox Code Playgroud)

要么:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi
Run Code Online (Sandbox Code Playgroud)

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

  • 值得一提的是,这不是线程安全的.在您检查目录是否存在以及尝试写入的时间之间,事情可能会发生变化. (5认同)

jim*_*orr 82

使用-p标志.

man mkdir
mkdir -p foo
Run Code Online (Sandbox Code Playgroud)

  • -p, --parents 如果存在则没有错误,根据需要创建父目录 (6认同)

小智 71

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

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这不是`mkdir`本身的功能,而是执行命令的shell.它被称为大括号扩展--AFAIK,只有Bash,ksh,zsh和C shell支持它. (18认同)
  • 这不是一个答案;这是一个单独的主题,作为评论更合适。 (4认同)
  • 如果你的逗号周围有空格,你可能(会)得到意想不到的结果.谨防. (3认同)

Jah*_*hid 35

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

[ -d newdir ] || mkdir newdir
Run Code Online (Sandbox Code Playgroud)

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

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
Run Code Online (Sandbox Code Playgroud)

  • 但是[受竞争条件影响](/sf/ask/55570091/#793916)? (2认同)

moo*_*oom 29

简单、沉默、致命:

mkdir -p /my/new/dir >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

  • 如果“my/new/dir”已经存在,“mkdir -p my/new/dir”不会抱怨,无需重定向输出 (8认同)

pax*_*blo 19

旧的尝试和真实

mkdir /tmp/qq >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果"tmp"不存在,这将失败.它也没有给你任何确认. (5认同)
  • @Peter,像(例如)`[ -d newdir ] || 这样的片段 mkdir newdir`(目录最初不存在)存在竞争条件,在测试是否存在和尝试创建之间,另一个进程可能会突然介入并创建该目录。因此“mkdir”将会失败。 (2认同)

小智 13

mkdir foo即使目录存在也能正常工作.要使其仅在名为"foo"的目录不存在时起作用,请尝试使用该-p标志.

示例: -

mkdir -p foo
Run Code Online (Sandbox Code Playgroud)

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

  • 正如@BrianCampbell所提到的,这也将在路径中创建任何其他目录.如果例如卸载卷,则可能会很危险,因为它可能会在挂载点中创建目录. (2认同)

小智 10

directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi
Run Code Online (Sandbox Code Playgroud)


vkr*_*ams 10

参考手册页man mkdir的选项 -p

   -p, --parents
          no error if existing, make parent directories as needed
Run Code Online (Sandbox Code Playgroud)

这将在给定路径中创建所有目录,如果存在则不会引发错误,否则它将在给定路径中从左到右创建所有目录。试试下面的命令。目录newdiranotherdir发出此命令之前不存在

正确使用

mkdir -p /tmp/newdir/anotherdir

执行命令后可以在/tmp下看到newdiranotherdir创建。您可以根据需要多次发出此命令,该命令始终具有exit(0). 由于这个原因,大多数人在使用这些实际路径之前在 shell 脚本中使用这个命令。


alk*_*kar 9

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

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi
Run Code Online (Sandbox Code Playgroud)

-e是korn shell的存在测试.

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


das*_*h-o 9

对“经典”解决方案(由 Brian Campbell 提出)的改进 - 处理目录符号链接的情况。

[ -d foo/. ] || mkdir foo
Run Code Online (Sandbox Code Playgroud)


Kar*_*ang 7

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

你可以用这个:

IF NOT EXIST dir_name MKDIR dir_name
Run Code Online (Sandbox Code Playgroud)

  • OP是关于AIX kornshell ......与Windows无关,是吗? (10认同)

Bal*_*yan 6

这是一个简单的函数(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"
}
Run Code Online (Sandbox Code Playgroud)

您可以将上述函数调用为:

createDirectory "$(mktemp -d dir-example.XXXXX)/fooDir/BarDir"

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


小智 5

mkdir -p sam
Run Code Online (Sandbox Code Playgroud)
  • mkdir = 创建目录
  • -p = --父母
  • (如果存在则没有错误,根据需要创建父目录)


Abh*_*ya8 5

您可以使用if循环来检查目录是否存在,如果没有退出,则可以创建目录。

1)dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi
Run Code Online (Sandbox Code Playgroud)

2)您可以使用带有-p选项的mkdir来创建目录。它将检查目录是否不可用。

mkdir -p $dir
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
Run Code Online (Sandbox Code Playgroud)

  • 我已经向您分享了当文件夹不存在时创建文件夹的方法。这取决于个人的要求。如果您有一个用例需要检查文件夹是否不存在并且您想要跟踪它,以便您可以使用解决方案 1。如果没关系,您可以使用解决方案 2,它将创建该文件夹如果不存在。 (2认同)