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

必须加 -R,不加就只改目录本身,子文件、子目录、隐藏文件全不动——这是 90% 权限问题的根源。
为什么 chown user:group mydir 没生效?
默认行为就是「只改目标路径这一层」。执行后 ls -ld mydir 看属主变了,但 ls -l mydir | head -3 会发现里面所有文件、.git/、node_modules/ 都还是原来的 owner/group。
- 典型后果:Nginx 报
403 Forbidden,PHP 写日志失败,Git 提交被拒 - 验证方法:用
ls -lR mydir | head -10快速扫一眼前几行,看是否全变 - 普通用户执行不报错但静默跳过——漏
sudo是常见盲区
chown -R 的写法和陷阱
语法看着简单,但几个细节错一个就白干:
- 必须用大写
-R,小写-r在部分老系统上会被忽略 - 用户和组之间必须用冒号
:,不用点.(dev.test:www-data正确,dev.test.www-data可能被误解析) - 路径含空格必须加引号:
sudo chown -R www-data:www-data "/var/www/my site" - 组名必须真实存在:
getent group www-data应有输出,否则报invalid group
符号链接怎么处理?
默认情况下,chown -R 会顺着符号链接去改它指向的目标文件,而不是链接自己。
- 想改链接文件本身的 owner/group(比如
current → releases/20260708这个current文件),必须加-h:sudo chown -h deploy:deploy current - 加了
-R又加-h,才会递归修改每一层链接文件自身 - 想跳过所有符号链接?
chown没这个开关,得先用find -type f过滤
UID/GID 比用户名更可靠
当用户已被删除、或在 NFS/Native 容器里查不到 /etc/passwd 时,用数字 ID 是唯一办法:
- 查 UID:
id -u www-data;查 GID:getent group www-data | cut -d: -f3 - 执行:
sudo chown -R 33:33 /var/www/html - 副作用:
ls -l可能显示33 33而不是名字——说明系统缺对应条目,不是命令没生效
真正容易被忽略的是不可变属性(i):哪怕 root 执行 chown -R 也会静默失败,得先 lsattr file 看有没有 i,再用 chattr -i file 解锁。


















