mkdir -m 是唯一原生命令级方案,它绕过 umask 直接写入权限,而普通 mkdir 会受 umask 影响;-m 仅作用于末级目录,不递归,且必须用三位八进制数(如 755),特殊权限需四位(如 2755)。

能,mkdir -m 是唯一原生命令级方案,但权限值不是“直接写进去就生效”,它会绕过 umask —— 这点容易被忽略,也是多数人设错权限的根源。
为什么 mkdir -m 755 和 mkdir && chmod 755 效果不同
默认情况下,mkdir 创建目录时会先按系统 umask(通常是 0022)扣减权限,再应用默认值(0777 & ~umask → 实际得 0755)。而 -m 参数强制跳过 umask 计算,直接把八进制值当作最终权限位写入 inode。
这意味着:
-
mkdir test→ 实际权限取决于当前umask,不可控 -
mkdir -m 755 test→ 无论 umask 是0002还是0077,结果都是严格rwxr-xr-x - 如果误用
chmod补设,可能因父目录 sticky bit 或 ACL 导致权限二次变化
mkdir -m 的权限参数必须是三位八进制数
不支持符号模式(如 u=rwx,g=rx,o=rx),也不接受十进制或十六进制。传入非三位八进制数会导致报错或静默失败:
- ✅ 正确:
mkdir -m 755 log、mkdir -m 700 private、mkdir -m 1777 tmp(含 sticky bit) - ❌ 错误:
mkdir -m 7556 log(四位)、mkdir -m rwxr-xr-x log(符号)、mkdir -m 0755 log(带前导零在部分 shell 中可能被解释为八进制,但不推荐) - ⚠️ 注意:
mkdir -m 777对目录来说等价于开放所有操作权限,包括删除子文件(只要父目录可写),实际生产环境极少需要
递归创建多层目录时,-p 和 -m 要配对使用
-p 自动创建缺失的父目录,但这些中间目录**不会继承** -m 指定的权限 —— 它们仍走 umask 路径。只有最末级目录获得 -m 设置的权限。
例如:
mkdir -p -m 755 /a/b/c
执行后:
-
/a和/a/b权限由 umask 决定(如 umask=0022 → 权限为755;umask=0002 → 权限为775) -
/a/b/c一定是755,不受 umask 影响 - 若需统一权限,得拆成两步:
mkdir -p /a/b && chmod -R 755 /a/b,或用循环逐层mkdir -m
特殊权限位(setuid/setgid/sticky)必须显式包含在八进制码中
-m 设置的是完整 mode 字段,不只是基础 rwx。要启用 setgid(使新建文件继承组 ID),得用四位八进制数,首位表示特殊位:
- setgid 目录:
mkdir -m 2755 shared→ 权限显示为drwxr-sr-x - sticky + setgid:
mkdir -m 3777 tmp→drwxrwsrwt - 仅 sticky(常见于
/tmp):mkdir -m 1777 mytmp - 错误写法:
mkdir -m 777 -S shared(-S不是mkdir选项)
没写首位,默认为 0,即无特殊权限。漏掉这个位,ls -l 看不到 s 或 t 标志。


















