mkdir -p 是创建多级目录的唯一可靠方式,它逐级创建缺失父目录且静默跳过已存在层级;配合 shell 大括号展开可高效批量建同级目录,但含空格或特殊字符时须用 while read 安全处理;权限需显式用 -m 设定以避免 umask 差异导致问题。

直接用 mkdir -p,不是“要不要加 -p”,而是不加就根本建不成多级路径。
mkdir -p 是创建多级目录的唯一可靠方式
Linux 默认拒绝创建上级目录不存在的路径。比如当前是空目录,执行 mkdir a/b/c 会报错:mkdir: cannot create directory ‘a/b/c’: No such file or directory。因为 a 和 a/b 都还没存在。
-
mkdir -p会从左到右逐级检查并创建所有缺失父目录,哪怕某层已存在也只静默跳过,不报错 - 命令如
mkdir -p project/src/main/java/com/example/app一条就能建完全部 6 层 - 别写成
mkdir -p a/b && mkdir -p a/c——重复写a是冗余,mkdir -p a/{b,c}更干净
批量建同级目录:用 shell 大括号展开,不是 mkdir 自带功能
大括号 {} 是 shell 解析的语法糖,不是 mkdir 的参数能力。它只在名字规则、无空格、无特殊字符时才安全高效。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 建
log202401到log202412:mkdir log2024{01..12}(注意{01..12}补零,{1..12}不补,排序和字符串比较会乱) - 建嵌套结构:
mkdir -p project/{src/{main,test},docs,config}等效于 5 条独立路径 - 大括号内不能有空格:
{a, b}会被拆成a和b(带前导空格),结果建出名字含空格的目录,后续操作容易崩
名字含空格或特殊字符?必须用 while read 安全读取列表
一旦文件夹名来自外部输入(CSV、日志提取、用户粘贴)、含空格、括号、中文或 $ * 等 shell 元字符,大括号和简单 for 循环都会失效或被截断。
- 把名字按行存为
dirs.txt,内容如:user data temp-cache config (backup)
- 执行:
while IFS= read -r dir; do mkdir -p "$dir" done < dirs.txt
- 关键在
IFS=(防首尾空格被 trim)和-r(防反斜杠转义),漏一个,user data就变成两个参数,触发mkdir: missing operand
权限别靠 umask,显式用 -m 设定
mkdir 默认权限受当前 umask 影响,而 umask 在不同环境可能不同(本地是 0002,CI 里可能是 0022),导致 group 写权限意外丢失。
- 要确保新建目录权限统一,必须加
-m:mkdir -p -m 755 logs/{error,info,warn} -
-m 755会覆盖 umask,但不会影响后续子目录的默认行为——所以每层都得显式传-m,或者在脚本里封装函数
真正麻烦的从来不是“怎么建”,而是名字来源不可控、权限要求明确、路径层级深且需幂等——这些点漏掉任一个,脚本上线后就容易半夜被报警叫醒。

















