ls -l是查看文件归属和基础权限最常用方式,第三列显示所有者、第四列显示所属组,权限符号与文件类型一并呈现;stat则直接读取inode元数据,提供更底层、准确的UID/GID、三类时间戳及定制化输出能力。

用 ls -l 看文件归属和基础权限
最常用也最直接的方式就是 ls -l,它能一次性显示所有者、所属组、权限符号和文件类型。输出中第三列是所有者(U),第四列是所属组(G),比如:
ls -l /etc/hosts -rw-r--r-- 1 root root 298 Nov 4 16:52 /etc/hosts
这里两个 root 分别代表所有者和所属组。注意:如果文件被设置了 setgid 位,组名后面会带个 s 或 S;如果是粘滞位(sticky bit),其他用户执行位会显示为 t 或 T。
常见误判点:
- 只输
ls不加-l,看不到归属信息 - 目录里有软链接时,
ls -l默认显示链接本身的所有者,不是目标文件的——要加-L才能看真实归属 - SELinux 启用时,末尾多一个
.(如-rw-r--r--.),不代表权限异常,只是 SELinux 上下文存在
用 stat 查 inode 级归属和时间戳细节
stat 是唯一能直接读取 inode 元数据的命令,比 ls 更底层、更准确,尤其适合排查权限“看似正常却报错”的情况。
关键用法:
-
stat /path/to/file:默认输出含所有者 UID、GID、三类时间戳(Access/Modify/Change)、inode 号、硬链接数等 -
stat -c "%n %U:%G %a" /etc/hosts:定制输出,%U和%G是用户名/组名(非数字 ID),%a是八进制权限 -
stat -L /symlink:强制跟随软链接,查目标文件的真实归属
为什么需要它?
-
ls -l的所有者名是查/etc/passwd和/etc/group映射出来的,如果 UID/GID 在系统里没对应条目,ls就显示数字,而stat始终返回原始 UID/GID 字段 - 硬链接数(
Links)为 0 时,说明文件已被rm删除但仍有进程打开——此时归属信息仍有效,但ls可能已不显示该文件
确认用户实际所属组要用 groups 和 id
文件归属写的是“所属组”,但用户可能属于多个附加组,这些组在文件权限判断中同样生效。仅看 ls -l 的第四列,容易误以为用户只有那个组权限。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
查当前用户全部组成员身份:
-
groups:只输出组名列表,简洁直观 -
id:输出 UID、GID 和所有 supplementary groups(附加组),带数字 ID,更适合脚本解析 -
id -un和id -gn可分别提取当前用户名和主组名
注意:/etc/group 文件本身不是“权限配置”,只是组定义;真正起作用的是用户登录时加载的组列表,由 id 命令反映,不是 cat /etc/group 能直接推断的。
批量查归属时避免 ls 解析陷阱
想查一堆文件的归属,别用 ls -l *.conf | awk '{print $3,$4,$9}' 这类靠空格切分的做法——文件名含空格或特殊字符时会崩。
安全做法是用 stat 配合 -c:
-
stat -c "%n %U:%G" *.conf:当前目录下所有.conf文件 -
find /etc -name "*.conf" -print0 | xargs -0 stat -c "%n %U:%G":跨子目录且兼容任意文件名
如果非要用 ls,至少加 -N(禁用引号转义)和 --quoting-style=shell-escape,但不如 stat 稳定。
真正容易被忽略的点是:文件系统挂载选项(如 noatime)会影响 Access 时间,但不会动 Modify/Change 时间;而 chown 或 chmod 会触发 Change 时间更新——这意味着,仅靠“时间没变”不能反推归属没改过。

















