chown -r 是唯一能递归修改目录及其所有子文件、子目录、隐藏文件所有权和所属组的方式,不加 -r 仅修改目标目录自身,子项完全不变。

chown 是唯一能真正修改文件夹(及其内容)所有者的命令,不加 -R 仅改目录自身,子项完全不动——这是最常踩的坑。
只改文件夹本身,不碰里面任何东西
默认行为就是「只改目标路径这一层」。比如 chown alice mydir 后,mydir 的所有者变了,但里面所有文件、子目录、.git/ 都还是原来的 owner/group。
- 适用场景:只想调整目录入口权限,比如把
/srv/app目录所有者设为部署用户,但内部文件由构建流程生成、不应被覆盖 - 验证方式:
ls -ld mydir看目录自身,再ls -l mydir | head -3确认里面没变 - 错误现象:执行完发现子文件访问仍被拒绝,其实是忘了递归
递归改整个文件夹树的所有者和组
chown -R 是批量修复归属关系的刚性需求,没有替代方案。它会穿透所有层级,包括隐藏文件、深层嵌套子目录。
- 语法必须带冒号:
chown -R alice:www-data /var/www/html;写成alice.www-data在部分系统会解析失败(尤其用户名含点时) - 普通用户无法执行
chown -R给他人:必须sudo或 root 权限,否则报Operation not permitted - 容器环境可能禁用
chown:某些 distroless 镜像直接报错,得换 UID/GID 启动或提前挂载好权限正确的卷 - 符号链接默认跟着改目标:如果
mylink → /tmp/realfile,chown -R alice mylink实际改的是/tmp/realfile;要只改链接文件自己,必须加-h
只改组、不动所有者,但容易被忽略
chown :groupname path 看似简单,但效果不可见于第一眼——属主列不变,只有属组列更新。很多人执行后看 ls -l 觉得没生效,其实是没注意第四列。
- 典型用途:统一日志目录属组为
adm,保留各服务原属主,方便审计组成员读取 - 验证要点:
ls -ld path查第二列(属组),不是第三列;对文件用ls -l file同理 - 组名必须真实存在:
getent group adm要有输出,否则报invalid group - 路径含空格?必须用引号:
chown :developers "/path/with space/file",否则 shell 截断
用 UID/GID 替代用户名,绕过名称解析失败
当用户已被删除但 UID 仍被文件引用,或 NFS 挂载点查不到本地 /etc/passwd 时,数字 ID 是唯一可靠方式。
- 查 UID:
id -u alice;查 GID:getent group www-data | cut -d: -f3 - 执行:
chown -R 1001:33 /var/www/html;注意:系统不会校验该 UID/GID 是否对应有效用户/组 - 副作用:
ls -l可能显示数字而非名字(如1001 33),说明/etc/passwd或/etc/group缺失对应条目 - 安全风险:输错 GID 可能导致服务无法读取资源(如 Web 进程不在新组里),操作前务必双重确认数值
ls -ld /target/path 记下原始状态;改完立刻 ls -l /target/path | head -5 抽样比对。递归操作没有撤回机制,路径写错一个字符就可能误伤系统目录。











