一次建多层目录、批量生成、设置权限,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):基于文档核查,尚未实际执行。
参考资料
- [1] mkdir(1) – Linux manual page (man7.org)(mkdir(1) 手册页)
- [2] mkdir invocation (GNU Coreutils 9.12)(GNU coreutils mkdir 文档)
- [3] mkdir(1) – Ubuntu 24.04 noble manual page(Ubuntu mkdir(1))
- [4] install(1) – Linux manual page (man7.org)(install(1) 手册页)
- [5] mkdir(2) – Linux manual page (man7.org)(mkdir(2) 系统调用)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。