mkdir 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于文件与目录操作命令族。建目录看起来简单,但
-p这一个选项就能让你少写一堆判断。
为什么写 mkdir?因为脚本里"确保目录存在"是高频需求,新手常写成 if [ ! -d x ]; then mkdir x; fi,其实一句 mkdir -p 全搞定。还有权限预设 -m,能省掉后续再加 chmod 的步骤。
mkdir(make directory,建目录)创建一个新的目录项。它不碰父目录里的内容,只新增一个空目录。
一、最基本的用法
mkdir logs # 建一个目录
mkdir a b c # 一次建多个
mkdir -p project/src/main # 递归建多级(中间不存在的也一并建)不加
-p时,父目录不存在会报错No such file or directory。-p(parents)让mkdir自动补齐所有缺失的父级,且目录已存在也不报错——这让它在脚本里用起来极其省心。
二、高频选项一张表
| 选项 | 作用 | 示例 |
|---|---|---|
-p | 递归建父目录;已存在不报错 | mkdir -p a/b/c |
-m | 创建时直接设权限模式(mode) | mkdir -m 755 bin |
-v | 显示建了哪些(verbose) | mkdir -pv a/b/c |
-Z | 设置 SELinux 安全上下文 | mkdir -Z ctx dir(少数发行版) |
-m设的权限会被 umask 影响?不会——-m是显式给定,直接生效,不受 umask 裁剪。而普通mkdir不加-m时,默认权限0777再减去 umask(通常得0755)。想精确控制,用-m。
三、实战 demo
demo 1:脚本里确保目录存在(最常用范式)
mkdir -p /var/myapp/logs /var/myapp/cache
# 无论父目录在不在、在几次,都只建缺失的,已存在不报错
# 脚本开头写这句,后面直接往里写文件,不用判断demo 2:一次建出项目骨架
mkdir -p myproject/{src,tests,docs,bin}
# 配合花括号展开,一行建出带子目录的结构
tree myproject
# myproject/
# ├── bin ├── docs ├── src └── testsdemo 3:建目录同时设好权限(给 web 用)
mkdir -m 755 /srv/www # 所有者全权,组和其他人读+进
mkdir -m 700 ~/.ssh # 只有自己能进(SSH 要求 700)
~/.ssh必须是700否则 SSH 可能拒绝用密钥登录——这是-m的经典场景。
demo 4:显示建了哪些(调试脚本时)
mkdir -pv build/{debug,release}
# -v 输出:mkdir: created directory 'build'
# mkdir: created directory 'build/debug'
# mkdir: created directory 'build/release'demo 5:在变量驱动的路径建目录(防空变量)
DEST="/data/$PROJ/output"
mkdir -p "$DEST" || { echo "建目录失败"; exit 1; }
# 引号包住变量,且检查返回值,避免 DEST 为空时建出 / 下乱七八糟的目录四、权限与 umask 的关系
普通 mkdir dir 创建出的权限 = 0777 & ~umask。多数系统 umask=022,所以得到 0755(rwxr-xr-x)。要看当前 umask:
umask # 输出 0022
mkdir test && ls -ld test # 看到 drwxr-xr-x(755)若想建出 700 的目录,要么 mkdir -m 700 dir(精确),要么临时改 umask:umask 077 && mkdir secret。改权限后续也能用 chmod。
五、和 rmdir / install 的关系
- rmdir:只能删空目录(
rmdir dir),非空报"Directory not empty";删非空目录用rm -r,见 rm。mkdir和 rmdir 是对称的建/删。 - install:既建目录又设权限还能拷文件(
install -d -m 755 /path),打包/安装脚本常用。
六、常见坑
- 忘了
-p又父目录不存在 → 报错;养成脚本里mkdir一律带-p的习惯。 mkdir a/b/c中若a已存在但a/b存在且是文件而非目录,b/c建不了(路径上不是目录)。-m的数字模式和 chmod 同语义(755=所有者全权、组和其他读+执行)。- 在只读文件系统(挂载 ro)上
mkdir会Read-only file system,先确认挂载可写(mount)。
相关命令
一句话总结
mkdir = 建目录:-p 递归建多级且已存在不报错,是脚本"确保目录在"的标配;-m 创建时直接设权限(不受 umask 裁剪),~/.ssh 建 700 是经典场景;删空目录用 rmdir、删非空用 rm -r。