mkdir -p 是创建多级目录的唯一可靠方式,因不加-p时mkdir只创建末级目录且父目录缺失必报错;加-p后自动逐级创建缺失父目录、跳过已存在目录,并支持大括号批量展开、双引号处理特殊字符、-m显式设权限。

mkdir 不需要安装——它是 GNU coreutils 的一部分,所有主流 Linux 发行版默认自带。
为什么 mkdir -p 是创建多级目录的唯一可靠方式
不加 -p 时,mkdir 只创建路径最末端的一级目录。只要中间任意一级(比如 project 或 project/src)不存在,就会报错:mkdir: cannot create directory ‘project/src/main’: No such file or directory。这不是权限问题,是命令设计如此。
加 -p 后,它会从左到右逐级检查并创建缺失的父目录,已存在的则静默跳过——这个行为不可替代,也没有替代命令。
-
mkdir -p src/main/java/com/example/app会依次创建src、src/main、src/main/java……直到app - 若
src已存在,它不会报错,也不会覆盖或修改已有内容 - 路径中不能有拼写错误或多余空格,否则会被拆成多个参数,导致部分命令失效
mkdir -p 配合大括号批量创建同级目录的边界条件
大括号展开(如 {docs,scripts,tests})由 shell 解析,不是 mkdir 自身功能。它只适用于命名规则、无空格、无特殊字符的场景。
- 正确:
mkdir -p project/{src/{main,test},docs,config}→ 展开为 4 个独立路径 - 错误:
mkdir -p project/{src, test}→ 实际生成project/src和project/ test(带前导空格) - 错误:
mkdir -p project/{user data,logs}→ shell 把空格当分隔符,报missing operand
一旦目录名含空格、中文、括号或 $,必须改用引号 + 逐行处理,不能硬套大括号。
权限必须用 -m 显式设置,别信 umask
不加 -m 时,新建目录权限由当前 shell 的 umask 决定。而 umask 在不同环境差异极大:本地可能是 0002,CI 流水线常设为 0022,结果就是组写权限在 CI 里直接丢失。
- 要公开可读执行:
mkdir -p -m 755 deploy/{bin,etc,logs} - 要严格私有:
mkdir -p -m 700 .cache/private -
-m必须放在-p后面(即mkdir -p -m 755 ...),顺序颠倒在旧版系统中可能被忽略 - 注意:目录至少需执行位(
x)才能cd进入,所以644对目录无效
含空格或特殊字符的目录名怎么安全创建
遇到 user data、config (backup)、项目文档 这类名字,唯一稳妥方式是用双引号包裹整个路径,并配合 while read 逐行处理。
例如,准备 dirs.txt,每行一个完整路径:
user data config (backup) 项目文档
然后执行:
while IFS= read -r dir; do mkdir -p "$dir"; done <p><code>IFS=</code> 防止行首尾空格被截断,<code>-r</code> 防止反斜杠被误解析——漏掉任一个,<code>user data</code> 就会崩成两个参数。</p><p>别试图用 <code>for</code> 循环或 <code>xargs</code> 处理这种输入,它们对换行符和空格的处理不可靠。</p>











