(伪)
另一种方法是一次创建一个目录?
#1 楼
$ mkdir -p foo/bar/zoo/andsoforth
参数
p
代表“父母”。#2 楼
对于大多数现代操作系统,使用mkdir -p
是一种简单的方法:mkdir -p foo/bar/zoo/andsoforth
但是,在许多手册中不建议使用
mkdir -p
。阅读有关使用make
的问题的GNU autoconf
和mkdir -p
的文档:http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/ html_node / Limitations-Usual-Tools.html#Limitations-Usual-Tools
http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Utilities-in-Makefiles .html
跨平台安装和配置系统具有
mkdir -p
自己的安全替代方案。CMake在shell命令行中使用:
Autoconf在预处理脚本中使用:
cmake -E make_directory foo/bar/zoo/andsoforth
或:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
,但是这些解决方案需要安装
cmake
或autoconf
(M4
)工具(以及可能的预处理)还可以将
install-sh
脚本与-d
选项一起使用:AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
autoconf
和automake
项目使用此脚本。我认为它一定是最安全的解决方案。当时我正在寻找一种没有依赖性的标准
/bin/sh
跨平台解决方案,但还没有找到。因此,我编写了下一个可能不理想的脚本,但我认为它符合大多数跨平台要求:install-sh -d foo/bar/zoo/andsoforth
该脚本可用于旧系统,没有
-p
的选项mkdir
。sed
的基于dirname
的跨平台版本已添加到代码中。它的工作方式与dirname
类似(使用路径/
正确,仅具有基本名称的路径,带有尾随/
的路径,带有和不带有尾随\n
的路径)。如果路径包含换行符或当前区域设置的某些无效字符,则此功能无法正常工作。它还用单个/
替换了//
(///
,/
)的任何组合将行
mkdir "" || return 1
更改为test -d "" || { mkdir "" || return 1; }
,因为如果路径存在,则mkdir
会终止,并且包含aaa\.
之类结构的路径需要进行此检查(如果aaa
不存在以前的版本会创建aaa
,然后尝试再次创建它。)如果路径已经存在,则此版本的mkd不会产生错误(但仍然有可能生成这样的错误)错误),并且无法在命令行中获得多个目录。
评论
“ mkdir -p”由posix定义。哪些unix或类似unix的变体不支持它? (尽管我认为没有任何理由不能将其内置),但是它不是内置的。)pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html
– Tim B
16年4月17日在22:49
该页面中的某些信息只有15年的历史。有些比较老。
–托马斯·迪基(Thomas Dickey)
16年4月17日在23:30
不支持mkdir -p的系统太旧(并且我们谈论的至少已经几十年了)而没有printf实用程序或支持-标记了选项的结束。
–StéphaneChazelas
16年4月18日在14:06
您的cdirname将为foo / bar //或包含换行符的目录名称或当前语言环境中的无效字符提供错误的答案。
–StéphaneChazelas
16年4月18日在14:12
在POSIX系统上,printf是安全的。 POSIX系统支持mkdir -p。几十年来,POSIX已指定mkdir -p。 -从80年代中期开始,从SysIII开始在AT&T系统上开始普及。我相信printf最初是作为ksh内置函数出现的,并且由POSIX在mkdir -p之后指定。某些POSIX shell(如基于pdksh或yash的)仍然没有内置printf。
–StéphaneChazelas
16年4月18日在14:28
#3 楼
命令-p
中的选项mkdir
会根据需要建立父目录(如果存在,则没有错误): :mkdir -p foo/bar/zoo/andsoforth
链接运算符
&&
用于将命令链接在一起,这样,当且仅当前一个命令没有错误退出时,才运行下一个命令。 > 当然,第一种方法更好。
#4 楼
mkdir foo foo/bar foo/bar/zoo/ foo/bar/zoo/andsofort.
应该这样做。
评论
linux.die.net/man/1/mkdir有趣的是,我当时在浏览该页面,但完全忽略了“父母”,因为我认为他们是孩子(从左到右)。
提示:在某些shell中,您甚至可以执行mkdir -p foo / {bar,baz} / zoo / andsoforth。非常有用!
就我个人而言,我也忽略了手册页中的“父”,因为,我觉得该标志应为“ -r”代表“递归”-或至少应该有一个别名,因为mkdir仅总共记录了6个标志。地狱,我觉得默认情况下该命令应递归创建目录,如果您不希望这样做,则必须明确指定。
stackoverflow.com/questions/1731767/…