mkdir -p 是唯一可靠方式,因普通 mkdir 仅创建末级目录,若任一父目录缺失即报“no such file or directory”错误;而 -p 自动逐级创建所有缺失父目录,已存在则跳过。

必须用 mkdir -p,其他方式不是失败就是不可靠。
为什么普通 mkdir 会报 “No such file or directory”
不加 -p 时,mkdir 只尝试创建路径最末端那一级目录。如果中间任何一级(比如 src 或 src/main)不存在,它就直接退出并报错:
mkdir: cannot create directory ‘src/main/java’: No such file or directory
这不是权限问题,是命令设计如此——它压根不检查或创建父目录。
-
mkdir src/main/java:要求src和src/main都已存在,否则失败 -
mkdir -p src/main/java:从左到右逐级创建src→src/main→src/main/java,已存在的目录自动跳过 - 路径中不能有拼写错误或多余空格,否则 shell 会把它们拆成多个参数,导致部分路径被忽略
批量建规则结构:用大括号展开,但有硬限制
大括号 {} 是 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(组不可写),结果组权限直接丢失 -
-m必须放在-p后面,即mkdir -p -m 755 ...;顺序颠倒可能被旧系统忽略 - 目录至少需执行位(
x)才能cd进入,所以644对目录无效
常见权限组合:
-
755:所有者可读写执行,组和其他人可读执行(适合公开目录) -
700:仅所有者可读写执行(适合私密目录,如.cache/private)
含空格或特殊字符的目录名怎么安全创建
遇到 user data、config (backup)、项目文档 这类名字,唯一稳妥方式是双引号包裹整个路径:
mkdir -p "user data" "config (backup)" "项目文档"
如果要批量创建,准备一个 dirs.txt,每行一个带引号的完整路径,再配合 while read:
while IFS= read -r dir; do mkdir -p "$dir"; done <p>注意:<code>"$dir"</code> 的双引号不能省,否则空格和特殊字符仍会破坏解析。</p> <p>最易被忽略的是权限一致性——同一套脚本在本地跑通,CI 里却因 <code>umask</code> 不同导致组无法写入,这类问题往往要等到部署失败才暴露。</p>











