18

我一直在阅读 OSX 手册页的描述。它有如下描述mkdir -p

-p

根据需要创建中间目录。如果未指定此选项,则每个操作数的完整路径前缀必须已经存在。另一方面,指定此选项后,如果作为操作数指定的目录已存在,则不会报告错误。中间目录是使用当前 umask 修改的 rwxrwxrwx (0777) 权限位以及所有者的写入和搜索权限创建的。

我不完全遵循这个描述。特别是“如果未指定此选项,则每个操作数的完整路径前缀必须已经存在。另一方面,指定此选项后,如果作为操作数给出的目录已存在,则不会报告错误。”

有人有关于这个解释的例子吗?

4

4 回答 4

39

鉴于此目录结构:

/
  foo/
  bar/
    baz/

这显然会起作用:

mkdir /foo/x

这将不起作用

mkdir /foo/x/y

因为/foo/x不存在,所以/foo/x/y无法在其下创建目录。前缀 需要存在/foo/x/才能创建./foo/x/y

这就是-p进来的地方。这有效:

mkdir -p /foo/x/y

/foo/x将与 一起隐式创建/foo/x/y

如果你试试:

mkdir /bar/baz

你会得到一个目录已经存在的错误。但是,如果您这样做:

mkdir -p /bar/baz

您不会收到错误消息,它只会默默地忽略所有已经存在的目录并满足于结果而不做任何事情。

于 2014-01-09T08:28:17.710 回答
2

假设您有一个空文件夹,并且您想创建一个名为“d1”的子目录和一个名为“d2”的“d1”子目录。通常你必须这样做:

mkdir d1
mkdir d1/d2

使用“-p”选项,您可以让 mkdir 为您创建中间目录 (d1):

mkdir -p d1/d2

您要问的那一点是,如果“d1”已经存在并且您使用“mkdir -p”,那么它已经存在并且不会有任何错误消息并不重要。

于 2014-01-09T08:31:55.853 回答
1

这项工作在版本 10.10.4

mkdir -pv d1/d/d3 
于 2015-08-02T16:01:34.027 回答
0

不确定它是否仅适用于 mac,但在 mac os x 上你可以

mkdir -p src/{main,test}/{java,resources,scala}

这不仅会给你一个嵌套的,而且你的目录的笛卡尔积:

src/test/java
src/test/resources
src/test/scala
src/main/java
src/main/resources
src/main/scala
于 2018-12-27T19:43:00.027 回答