442 mkdir
是否有我忽略的 linux 命令可以执行以下操作:(伪)
$ mkdir -R foo/bar/zoo/andsoforth
Run Code Online (Sandbox Code Playgroud)
或者除了一次创建一个目录之外别无选择?
EEA*_*EAA 712
$ mkdir -p foo/bar/zoo/andsoforth
Run Code Online (Sandbox Code Playgroud)
参数p代表“父母”。
小智 23
mkdir -p对于大多数现代操作系统来说,使用是一种简单的方法:
mkdir -p foo/bar/zoo/andsoforth
Run Code Online (Sandbox Code Playgroud)
但是,mkdir -p在许多手册中都不推荐使用。阅读 GNU 的文档make以及autoconf有关使用的问题mkdir -p:
跨平台安装和配置系统对于mkdir -p.
在 shell 命令行中使用的 CMake:
 cmake -E make_directory foo/bar/zoo/andsoforth
Run Code Online (Sandbox Code Playgroud)
Autoconf 在脚本中使用预处理:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
Run Code Online (Sandbox Code Playgroud)
或者:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Run Code Online (Sandbox Code Playgroud)
但是这些解决方案需要安装cmake或autoconf( M4) 工具(以及可能的预处理)
您还可以使用install-sh带有-d选项的脚本:
install-sh -d foo/bar/zoo/andsoforth
Run Code Online (Sandbox Code Playgroud)
该脚本由autoconf和automake项目使用。我认为这一定是最安全的解决方案。
当时我正在寻找一种/bin/sh没有依赖性的标准跨平台解决方案,但还没有找到。因此我写了下一个可能不太理想的脚本,但我认为它符合大多数跨平台要求:
#! /bin/sh
cdirname() # cross platform alternative for 'dirname'
{
  # $1 - path
  test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
  echo "$1" | sed -n -e '1p' | sed  -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}
mkd() # cross platform alternative for 'mkdir -p'
{
  # $1 - directory to create
  test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
  test -d "$1"  && return 0
  test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
  test -d "$1" || { mkdir "$1" || return 1; }
  return 0
}
Run Code Online (Sandbox Code Playgroud)
该脚本可以使用旧系统,其中选择-p的mkdir是不存在的。
sed-基于跨平台版本的dirname已添加到代码中。它的工作方式类似于dirname(使用 path 正确,/仅带有基本名称的路径,带有尾随的/路径,带有和不带有尾随\ns 的路径)。如果路径有换行符或当前语言环境的某些无效字符,则此功能无法正常工作。它还将/( //, ///) 的任意组合替换为单个/
将行更改mkdir "$1" || return 1为test -d "$1" || { mkdir "$1" || return 1; }因为mkdir如果路径存在则以错误终止,并且对于包含类似结构的路径需要此检查aaa\.(如果aaa不存在先前版本创建aaa然后尝试再次创建它)。
如果路径已经存在,这个版本的 mkd 不会产生错误(但它仍然有可能在并行执行中产生这样的错误)并且无法在命令行中获取多个目录。