chown 是修改文件或目录所属用户和组的标准命令,单次操作默认不递归,加 -R 选项可递归修改整个目录树;仅改组可用 chgrp,更语义清晰且普通用户可操作自身所属组。

直接用 `chown` 命令就能改文件或目录的所属用户(所有者)和组(所属组),这是最标准、最可靠的方式。关键在于写对语法、加对选项,否则容易只改了目录本身,里面的内容完全没变。
改单个文件或目录(不递归)
默认行为只影响目标路径自身,不碰子项:
-
chown alice file.txt —— 只改所有者,所属组保持不变
-
chown :developers file.txt —— 只改所属组,所有者不变(注意冒号开头,前面不能有空格)
-
chown alice:developers file.txt —— 同时改所有者和所属组
执行后用
ls -l file.txt 查看:第三列是所有者,第四列是所属组。别误把第三列当属组——那是硬链接数。
改整个目录及其全部内容(递归)
要让子目录、子文件、隐藏文件(如
.git、
.env)全部生效,必须加
-R:
-
sudo chown -R www-data:www-data /var/www/html —— Web 部署常用
-
sudo chown -R 1001:33 /srv/app —— 用 UID/GID 更稳妥,适合用户已删或 NFS 挂载场景
不加
-R 是常见错误:执行完发现 PHP 报 “Permission denied”,其实只是子文件还挂着旧 owner。验证方法:
ls -ld /path 看目录自身,再
ls -l /path | head -3 看里面几个文件是否同步变了。
只改组、不动所有者
比如把一批日志加入
adm 组方便运维读取,但保留原作者便于审计:
sudo chown -R :adm /var/log/myapp/
- 确保组存在:
getent group adm 有输出才行,否则报 “invalid group”
- 路径含空格?记得加引号:
sudo chown :developers "/opt/my project/config.ini"
仅改组时的替代命令:chgrp
如果只需要改组,
chgrp 更语义清晰,效果等同于
chown :groupname:
sudo chgrp -R developers /home/project
- 它不能改所有者,但同样支持
-R 和组名/GID
- 普通用户可用它把自己文件的组改成自己所属的附加组(如
docker、wheel),无需 root 权限
始终是核心前提:改所有者必须是 root 或 sudo;改组时,普通用户只能设为自己所属的组之一。