mkdir需加-p创建多级目录、-m设权限、空格分隔多个目录;-p跳过已存目录,-m绕过umask,大括号展开依赖shell,-v在脚本中慎用。

直接用 mkdir 就能创建目录,但不加参数时它拒绝创建多级路径、不处理已存在目录、也不设权限——这些恰恰是日常最常踩的坑。
mkdir 不带 -p 时无法创建嵌套路径
比如执行 mkdir docs/api/v1,只要 docs 或 api 任一父目录不存在,就会报错:mkdir: cannot create directory ‘docs/api/v1’: No such file or directory。
这不是命令坏了,是它默认只建「最后一层」。解决办法只有一个:mkdir -p docs/api/v1。
-
-p会逐级检查并创建所有缺失的上级目录,哪怕docs根本不存在也没关系 - 重复执行
mkdir -p不会报错,已存在的目录会被跳过(安全) - 别用
mkdir -p创建同名文件——它不会覆盖,但会报Not a directory错误
用 -m 设置权限时,umask 会被绕过
默认新建目录权限是 755(取决于当前 umask),但加了 -m 就完全按你写的来,不管 umask 是多少。
例如:mkdir -m 700 private 会强制生成权限为 drwx------ 的目录,其他用户连 ls 都看不到。
-
-m 755和不加-m效果通常一样,但不保证——依赖 umask 的话,不同用户或 shell 环境可能结果不同 -
-m必须紧跟在mkdir后,不能写成mkdir private -m 700(顺序错就失效) - 权限数字写错(比如写成
800)会导致命令静默失败或权限异常,建议用ls -ld 目录名立即验证
批量创建多个同级目录要空格分隔,不能用逗号或引号
想一次建 src、bin、lib 三个目录,正确写法是:mkdir src bin lib。
常见错误包括:
- 写成
mkdir "src, bin, lib"—— 这会建一个名叫src, bin, lib的单个目录 - 写成
mkdir src,bin,lib—— shell 会把逗号当分隔符,实际执行的是mkdir src,然后报bin: command not found - 混用
-p和多个目录名时,-p对所有目标生效:mkdir -p a/b c/d会建出a/b和c/d两套完整路径
用大括号展开快速建复杂结构,但注意 shell 兼容性
像项目常用结构 src/{lib,bin,doc/{js,css}},可以用:mkdir -p src/{lib,bin,doc/{js,css}},shell 会自动展开成多个路径再交给 mkdir。
这功能依赖 bash/zsh 的大括号展开,不是 mkdir 自己的能力。
- 在 dash(Ubuntu 默认 /bin/sh)下会直接报错,因为不支持大括号展开
- 路径中含空格时,大括号展开容易出错,建议先用
echo src/{lib,bin}预览展开结果 - 层级太深(比如超过 4 层嵌套)可能导致参数长度超限,
Argument list too long错误会出现
真正容易被忽略的是:-p 和 -m 可以同时用,但 -v(显示过程)在脚本里要小心——它会向 stdout 输出提示,可能干扰后续管道或判断逻辑。










