首页 > Sysadmin > 正文

Linux 创建目录树:-p、-m 与批量

huyuanwen 2026-11-01 Sysadmin

一次建多层目录、批量生成、设置权限,mkdir 与 install -d 都能做到。

一、递归创建多级目录

默认 mkdir 只能创建单层目录,父目录不存在时报错:

mkdir -p src/com/example/app

-p(--parents)逐层创建缺失的父目录;目标目录已存在时不报错 [1]。实测中 -p 创建的中间层目录权限不受后续 -m 影响——-m 仅作用于命令行中显式指定的目录 [2]。

二、批量生成同级目录

Bash 花括号展开可让 mkdir 一次性创建多个同级目录:

mkdir -pv project/{src,bin,doc,tests}

-v(--verbose)会逐行打印创建的目录名,适合脚本中确认执行范围 [3]。展开后的目录名不能包含逗号或空格,否则需改用数组或 xargs。

三、创建时指定权限

-m(--mode)在创建时直接设置权限,语法与 chmod 一致,且不受当前 umask 影响:

mkdir -m 700 secret-dir

上述命令创建 secret-dir 并立即设为 700,无需后续 chmod [1]。若想批量创建多个目录并统一权限,直接追加到命令末尾即可。

四、替代方案:install -d

install 来自 coreutils,其 -d 模式专用于创建目录,同样支持递归与权限设置:

install -d -m 755 logs data/raw output/final

install -d 会自动创建缺失的父目录,行为类似 mkdir -p,但在某些发行版的 initramfs 或最小容器中比 mkdir 更常见 [4]。脚本兼容性要求高时,可以 install -d 作为回退。

五、回滚与排错

  • 误创建多层目录:直接用 rm -rf <目标> 删除;无残留挂载或 inode 引用问题。
  • mkdir: cannot create directory …: File exists:去掉 -p 或改用 mkdir -p 忽略已存在目录。
  • 权限被 umask 污染:使用 -m 显式指定,不要依赖默认值。
  • 花括号展开不生效:确认当前 shell 为 Bash;POSIX sh 不支持此语法。

局限:mkdir 的递归深度仅受文件系统限制;Windows 长路径或 CIFS 挂载点可能提前失败。install -d 不支持 --context 等 SELinux 扩展 [5]。

—

草稿待审

  • install -d 在 Alpine/BusyBox 中的行为差异:基于文档核查,尚未实际执行。
  • SELinux/AppArmor 安全上下文选项(-Z/--context):基于文档核查,尚未实际执行。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。