mkdir 是什么
mkdir 是 GNU coreutils 里的建目录命令,一次可以创建一级或多级目录。它默认只建最后一段:父目录不存在时直接报 No such file or directory;加上 -p 才会把缺失的父目录一并补齐,并且目标已存在时不再报错,这正是脚本里「幂等建目录」的标准写法。新建目录的权限等于默认模式 777 与 ~umask 按位与的结果,用 -m 可以绕开 umask 直接指定。
基本信息
| 适用平台 | Linux 发行版通用(GNU coreutils);BusyBox 精简版选项较少 |
|---|---|
| 命令语法 | mkdir [选项] 目录... |
| 常用选项 | -p 递归创建缺失父目录且忽略已存在 / -m 模式 直接指定权限 / -v 显示每个实际创建的目录 / -Z 设置 SELinux 上下文 |
| 权限要求 | 需要对父目录有写权限与执行权限;在 /、/usr 等系统目录下建目录需要 root |
典型使用场景
- 部署脚本建目录骨架:mkdir -p /data/app/{conf,logs,tmp} 一条命令建好多级与多个子目录,重复执行不报错
- 严格控制权限的目录:mkdir -m 700 ~/.ssh,密钥目录不允许同组或其他人进入
- 按日期归档:mkdir -p /backup/$(date +%Y%m%d) 给每天的备份留独立目录
- 批量生成平行结构:mkdir -p project/{src,test,docs} 快速搭出工程骨架
- 清理脚本占位:先建临时空目录做落点,任务结束后用 rmdir 收走
常用示例
常用示例
mkdir -p /data/app/{conf,logs,tmp} # 多级 + 多子目录,一次建成
mkdir -m 750 /srv/secure # 直接指定权限,不受 umask 影响
mkdir -pv a/b/c # 显示实际创建的每一级目录
mkdir -p /backup/$(date +%F) # 按日期建归档目录
mkdir -v release-v1 release-v2 # 批量建一级目录并回显
mkdir -p -- '-weird-name' # 目录名以 - 开头时用 -- 分隔权限与 umask 的关系
权限与 umask 的关系
umask # 例如输出 0022
mkdir -m 777 d1; stat -c %a d1 # 777:-m 覆盖 umask
mkdir d2; stat -c %a d2 # 755 = 777 与 ~022 按位与常用选项
| 选项 | 作用 | 使用提示 |
|---|---|---|
| -p | 递归创建缺失的父目录,目标已存在也不报错 | 脚本里的默认选择,保证可重复执行 |
| -m 模式 | 用八进制模式指定权限,不受 umask 影响 | 敏感目录用 700 或 750 |
| -v | 打印每个实际创建的目录 | 排查脚本到底建了什么 |
| -Z 上下文 | 设置 SELinux 安全上下文 | 只在启用了 SELinux 的系统上有效 |
| -- | 选项与参数分隔 | 用来处理以 - 开头的目录名 |
umask 决定默认权限:目录默认是 777 与 ~umask 的按位与(常见 755),文件默认是 666 与 ~umask 的按位与(常见 644)。要做共享目录,可再给目录加 setgid 位(chmod 2775),让其中新建的文件自动继承父目录的组。
需要同时定好属主、属组与权限的目录,用 install -d -m 750 -o app -g app /opt/app/conf 一条命令搞定,比 mkdir 加 chown 加 chmod 三步少两次出错机会。
常见权限取值
| 模式 | 含义 | 典型目录 |
|---|---|---|
| 700 | 仅属主可读写执行 | 密钥目录 ~/.ssh |
| 750 | 属主全权限,同组可读可进入 | 团队组内共享的配置目录 |
| 755 | 所有人可读可进入,仅属主可写 | 网站静态目录、命令目录 |
| 2775 | 在 775 基础上加 setgid,新建文件自动继承该目录的组 | 多人协作的共享目录 |
| 1777 | 加 sticky 位,只有属主能删自己的文件 | 类似 /tmp 的公共目录 |
常见误用
- 用 chmod -R 777 处理「权限不够」,把安全边界一次性拆掉;应先定位缺的是哪一级目录的哪个位
- 把递归改权限当日常操作,结果给普通文件也加上了执行位
- 建完目录忘记改属主,服务以另一个用户运行仍然写不进去
目录的 x 位表示「可以通过并进入」:只给 r 不给 x 时,ls 能看到目录里的文件名,却读不到文件内容,共享目录最常见的权限投诉就是这种缺 x 的组合。
递归改权限时不要一把梭:-R 会把执行位加到普通文件上。规范做法是先对目录统一加 x,再对文件统一去掉 x,两条命令分工完成。