Linux设备与存储精读 · L02-04 | `stat` / `ls` 常用选项精读:读懂一个路径
模块:L02 文件、路径与元数据
篇号:L02-04 / 38
预计阅读:45 分钟
主线:Linux 设备与存储
文章目录
- 本篇目标
- 30 秒速览
- 正文
- 1. 读一条 `ls -l`(复习并定锚)
- 2. `ls`:存储场景高频用法
- 2.1 看目录自身还是看目录里面
- 2.2 隐藏项与递归
- 2.3 inode、人类可读、数字身份
- 2.4 符号链接:跟随与否
- 2.5 排序与单列
- 2.6 类型提示与 SELinux 标签(点到)
- 3. `stat`:字段级元数据
- 3.1 跟随链接
- 3.2 自定义格式(脚本必备)
- 3.3 看文件系统本身
- 4. `file`:内容/魔数线索
- 5. `namei`:路径逐级拆开
- 6. 组合拳:一条路径怎么读透
- 常用选项清单(必会)
- `ls`
- `stat`
- `file`
- `namei`
- Android 对照
- 检查清单
- 练习
- 判断题(对 / 错)
- 选项填空
- 读输出题
- 操作题
- 本篇边界
- L02 模块小结
- 下一篇预告
本篇目标
把ls、stat的常用选项练到会选、会读;并用file、namei补齐「内容线索」与「路径逐级解析」。学完后,对任意路径能快速回答:类型、inode、是否跟随链接、大小/时间、属主,以及中间哪一层目录卡住访问。
30 秒速览
ls -l:类型 + 权限 + 链接数 + 属主 + 大小 + 时间 + 名字;存储排障第一探针。- 高频组合:
-ld(看目录自身)、-lL(跟随符号链接)、-li(inode)、-lh(人类可读大小)、-ln(数字 uid/gid)。 stat:同一套元数据的「字段级」视图;-c/--format脚本化;-L跟随链接;-f看文件系统级信息。file:按魔数猜内容类型(镜像/稀疏等线索)。namei:按路径分量逐级显示类型与权限,适合查「中间目录不可穿越」。
正文
1. 读一条ls -l(复习并定锚)
adb shellls-l/dev/block/by-name/userdata# 服务器:ls-l/tmp字段之间故意多留空格,方便对竖线(等宽字体下阅读):
lrwxrwxrwx 1 root root 20 2024-01-01 12:00 userdata -> /dev/block/dm-56 │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ⑦ 名字(含 -> 目标) │ │ │ │ │ └─ ⑥ 时间 │ │ │ │ └─ ⑤ 大小* │ │ │ └─ ④ 属组 │ │ └─ ③ 属主 │ └─ ② 硬链接计数 └─ ① 类型(首字符 l) + 权限(后九位)拆开对照同一行:
① lrwxrwxrwx 类型 l + 权限 rwxrwxrwx ② 1 硬链接计数 ③ root 属主 ④ root 属组 ⑤ 20 大小* ⑥ 2024-01-01 12:00 时间 ⑦ userdata -> /dev/block/dm-56 名字(符号链接带 ->)* 第⑤列随类型而变:
- 符号链接:目标字符串长度(本例
20="/dev/block/dm-56"的长度) - 普通文件:字节大小
- 块设备:常为
major, minor(不是容量)
容量看blockdev/ls -lL目标节点等(L05/L11),不要把这里的20当成块设备大小。
权限九位的语义在 L03;本篇把选项用熟,并把「看链接本身 / 看目标」分开。
2.ls:存储场景高频用法
2.1 看目录自身还是看目录里面
ls-l/data# 列出目录「内容」ls-ld/data# 列出目录「自己」这一行(挂载点排障常用)2.2 隐藏项与递归
ls-la/data/local/tmp# 含 . 与 .. 及隐藏名ls-lA/data/local/tmp# 含隐藏名,通常不含 . 与 ..ls-lR/data/local/tmp# 递归(目录大时慎用)2.3 inode、人类可读、数字身份
ls-lifile# inode 号(L02-02)ls-lhfile# 大小用 K/M/Gls-lnfile# 属主/属组显示为 uid/gid 数字Android 上对照id时,-n很有用(L03)。
2.4 符号链接:跟随与否
ls-l/dev/block/by-name/userdata# 链接本身(l)ls-lL/dev/block/by-name/userdata# 跟随,显示目标属性(常为 b)ls-lHsome-link# 命令行参数若是链接则跟随;目录内容里的链接不跟随(GNU)| 选项 | 行为直觉 |
|---|---|
默认-l | 对符号链接显示链接本身 |
-L | 遍历时跟随符号链接(显示目标) |
-H | 仅跟随「作为命令参数出现的」符号链接 |
2.5 排序与单列
ls-lt# 按修改时间,新的在前ls-ltr# 时间排序后反转(日志目录常用)ls-lS# 按大小ls-1# 一列一个名字(脚本友好)2.6 类型提示与 SELinux 标签(点到)
ls-lF# 目录名后 /,可执行后 *,链接后 @ 等ls-lp# 目录名后加 /ls-lZ# 显示 SELinux 上下文(有则显示;规则编写不在本专栏)Z只要求会看「还有标签」;DAC 与 MAC 关系见 L12/L13。
3.stat:字段级元数据
stat/datastat/dev/block/by-name/userdatastat-L/dev/block/by-name/userdata无选项时输出多行:文件名、大小、块数、类型、inode、链接数、权限、uid/gid、三个时间戳等。不同实现版式略有差异,字段含义一致。
3.1 跟随链接
statsymlink# 默认:链接本身stat-Lsymlink# 目标(等价于 dereference)对 by-name:要看块设备的 major/minor、权限,用stat -L或先readlink -f再stat真身。
3.2 自定义格式(脚本必备)
GNU / 完整 coreutils:
stat-c'%n %F %i %s %a %U:%G'/etc/hostsstat-c'%n %t,%T'/dev/loop0# 设备号(十六进制 major/minor,视实现)stat-c'%x %y %z'file# atime mtime ctime常用格式符(必会):
| 格式符 | 含义 |
|---|---|
%n | 文件名 |
%F | 类型描述(regular file / directory / symbolic link / block special file…) |
%f | 原始 mode(十六进制) |
%a | 权限八进制(如 644) |
%A | 权限人类可读(如 -rw-r–r–) |
%i | inode |
%h | 硬链接数 |
%s | 大小(字节) |
%b | 已分配块数(实现相关) |
%U%u | 属主名 / uid |
%G%g | 属组名 / gid |
%x%y%z | atime / mtime / ctime |
%w | 诞生时间(支持则显示,否则-) |
%d%D | 所在设备号(十进制 / 十六进制) |
%t%T | 设备节点 major/minor(十六进制,设备文件) |
toyboxstat可能只支持部分格式符或选项名不同;板上用可用子集,完整格式在服务器练。
3.3 看文件系统本身
stat-f/datastat-f-c'%n %t %S %b %f %a'/data2>/dev/null-f切换到文件系统级统计(类型、块大小、总块数/空闲等),与df信息相邻;精确定量对比见 L11。
4.file:内容/魔数线索
file/tmp/storage-lab.imgfile-L/dev/block/by-name/userdata2>/dev/nullfile-bpath# 只打印结果,不打印路径前缀file-ipath# MIME 类型对镜像文件可区分 raw、sparse、各类 FS 镜像等线索(L08 会再用)。
对块设备节点,file有时只报block special;真正看 FS 类型更常用blkid/mount(L05/L06)。
5.namei:路径逐级拆开
namei /data/local/tmp namei-l/data/local/tmp namei-m/data/local/tmp示意:每一级显示f/d/l等,以及权限;适合回答「Permission denied 卡在中间哪一层」。
| 选项 | 含义 |
|---|---|
-l | 长格式(权限、属主等) |
-m | 显示 mode |
-o | 显示拥有者详情(实现相关) |
-x | 碰到挂载点时显示文件系统类型等(实现相关) |
-n | 不跟随符号链接(实现相关) |
-v | 更啰嗦 |
Android 上常无namei→ 服务器练;板上可用反复ls -ld各级前缀路径代替。
# 无 namei 时的等价思路adb shellls-ld/data adb shellls-ld/data/local adb shellls-ld/data/local/tmp6. 组合拳:一条路径怎么读透
以 by-name 为例:
adb shellls-l/dev/block/by-name/userdata adb shellls-lL/dev/block/by-name/userdata adb shellstat/dev/block/by-name/userdata adb shellstat-L/dev/block/by-name/userdata adb shell readlink-f/dev/block/by-name/userdata| 问题 | 优先探针 |
|---|---|
| 是不是符号链接? | ls -l/stat(不跟随) |
| 目标块设备权限/设备号? | ls -lL/stat -L |
| inode / 精确字节大小? | ls -li/stat -c '%i %s' |
| 目录自身权限(挂载点)? | ls -ld/stat |
| 中间哪级目录卡住? | namei -l或逐级ls -ld |
| 文件内容像什么? | file |
常用选项清单(必会)
ls
| 选项 | 含义 | 典型场景 | Android/toybox | 远程服务器 |
|---|---|---|---|---|
-l | 长格式 | 看类型/权限/属主/大小 | 有 | 有 |
-a | 含隐藏项与... | 查隐藏配置 | 有 | 有 |
-A | 含隐藏项,通常不含... | 列表更干净 | 有 | 有 |
-d | 列出目录自身而非内容 | 挂载点、目录权限 | 有 | 有 |
-h | 与-l联用,人类可读大小 | 看镜像文件大小 | 有 | 有 |
-i | 显示 inode | 硬链接对照(L02-02/03) | 有 | 有 |
-L | 跟随符号链接 | by-name → 块设备属性 | 有 | 有 |
-H | 跟随作为参数的符号链接 | 精细控制跟随 | 视实现 | 有 |
-n | 数字 uid/gid | 与id对照 | 有 | 有 |
-R | 递归 | 小目录树;大树慎用 | 有 | 有 |
-1 | 单列 | 脚本处理名单 | 有 | 有 |
-t | 按 mtime 排序 | 找最新日志/产物 | 有 | 有 |
-S | 按大小排序 | 找大文件 | 有 | 有 |
-r | 反转排序 | 与-t/-S组合 | 有 | 有 |
-F | 类型后缀提示 | 快速扫目录 | 有 | 有 |
-p | 目录名后加/ | 同上(更克制) | 有 | 有 |
-Z | SELinux 上下文 | 确认「还有标签」 | 常见 | 视系统 |
--full-time | 完整时间戳 | 精确比对时间 | 常无 | 有(GNU) |
-G/-g | 长格式中省略属组或属主 | 窄屏阅读 | 视实现 | 有 |
--color=auto | 颜色 | 交互浏览 | 视实现 | 有 |
-R+ 管道/head | 控制递归输出量 | 避免刷屏 | 有 | 有 |
必会读法(非选项):行首类型字符;设备节点的major, minor;链接的->。
stat
| 选项/用法 | 含义 | 典型场景 | Android/toybox | 远程服务器 |
|---|---|---|---|---|
| (无) | 多行摘要 | 人工查看 | 有 | 有 |
-L/--dereference | 跟随符号链接 | by-name 看目标 | 常见 | 有 |
-c FMT/--format=FMT | 按格式串输出 | 脚本抽取字段 | 部分 | 有 |
-f/--file-system | 文件系统级信息 | 与df对照入口 | 视实现 | 有 |
-t/--terse | 简短输出 | 快速扫 | 视实现 | 有 |
-c '%n %F %i %s %a' | 名/类型/inode/大小/八进制权限 | 最常用脚本组合 | 部分 | 有 |
-c '%U:%G %u:%g' | 属主属组 | 权限排障 | 部分 | 有 |
-c '%x %y %z' | 三个时间 | 同步/缓存问题线索 | 部分 | 有 |
-c '%t %T' | 设备 major/minor | 块设备节点 | 部分 | 有 |
--printf=FMT | 格式串(可含\n) | 精确控制输出 | 常无 | 有(GNU) |
file
| 选项 | 含义 | 典型场景 | Android/toybox | 远程服务器 |
|---|---|---|---|---|
| (无) | 路径 + 猜测结果 | 看镜像/二进制线索 | 视实现 | 有 |
-b | 不打印路径前缀 | 脚本 | 视实现 | 有 |
-i | MIME | 分类文件 | 视实现 | 有 |
-L | 跟随符号链接 | 对链接查目标内容类型 | 视实现 | 有 |
-s | 对特殊文件也读内容探测 | 谨慎用于设备 | 视实现 | 有 |
-z | 尝试看压缩包内 | 压缩镜像 | 视实现 | 有 |
-E | 出错时不继续猜 | 脚本稳健 | 视实现 | 有 |
--mime-type | 只打 MIME type | 脚本 | 常无 | 有 |
namei
| 选项 | 含义 | 典型场景 | Android/toybox | 远程服务器 |
|---|---|---|---|---|
| (无) | 逐级类型 | 路径解析 | 常无 | 有 |
-l | 长格式 | 查哪级权限不足 | 常无 | 有 |
-m | 显示 mode | 同上 | 常无 | 有 |
-o | 拥有者信息 | 同上 | 常无 | 有 |
-x | 显示挂载点/FS 线索 | 跨挂载点路径 | 常无 | 有 |
-n | 不跟随符号链接 | 与跟随对比 | 常无 | 有 |
-v | 详细 | 调试 | 常无 | 有 |
无namei时:对路径每一级前缀执行ls -ld。
Android 对照
adb shellls-ld/data adb shellls-l/dev/block/by-name/userdata adb shellls-lL/dev/block/by-name/userdata adb shellls-li/data/local/tmp2>/dev/null|headadb shellstat/data adb shellstat-L/dev/block/by-name/userdata| 需求 | 板上优先 |
|---|---|
| 挂载点目录自身 | ls -ld |
| by-name → 块设备 | ls -l+ls -lL或stat+stat -L |
| inode | ls -li |
无namei | 逐级ls -ld |
完整stat -c/file/namei | 远程服务器 |
检查清单
- 会用
-ld/-lL/-li/-lh/-ln/-la/-lR(知其风险) - 会用
stat、stat -L、stat -c '%n %F %i %s %a' - 会用
stat -f作为文件系统信息入口 - 会用
file看普通文件/镜像线索 - 会用
namei -l或逐级ls -ld定位路径中哪一层有问题 - 对 by-name 能分清「链接自身」与「目标块设备」两套输出
练习
判断题(对 / 错)
ls -l /data与ls -ld /data显示的是同一类信息。ls -lL作用于 by-name 时,便于查看目标块设备的类型与权限。stat默认一定跟随符号链接到目标。- inode 号应当跨
/data与/system比较是否相等,以判断是否同一文件。
- 错。前者列内容,后者列目录自身。
- 对。
- 错。默认看链接自身;跟随用
-L。 - 错。inode 只在同一文件系统内有意义(L02-02)。
选项填空
- 只看挂载点
/data自己的类型与权限:ls ___ /data - 脚本要打印「路径、类型名、inode、字节大小」:
stat -c '________' path - 跟随 by-name 查看目标:
stat ___ path或ls ___ path
-ld'%n %F %i %s'(等价字段顺序可调整)-L;-lL
读输出题
$ ls -ld /data drwxrwx--x 1 root system 4096 ... /data $ ls -l /dev/block/by-name/userdata lrwxrwxrwx 1 root root 20 ... userdata -> /dev/block/dm-56 $ stat -c '%F %i %s %a' /dev/block/by-name/userdata symbolic link 234 20 777 $ stat -L -c '%F %t %T %a' /dev/block/by-name/userdata block special file 00 fe 660/data的类型与属主属组?- by-name 未跟随时,
%s为 20 更可能表示什么? - 跟随后类型与权限八进制是什么?
- 目录;root:system。
- 符号链接目标字符串长度(约 20 字节),不是块设备容量。
- block special file;660。
操作题
Android:
adb shellls-ld/data /dev/block adb shellls-l/dev/block/by-name/userdata adb shellls-lL/dev/block/by-name/userdata adb shellstat/data远程服务器:
cd/tmpechohi>ls-stat-demo.txtln-sls-stat-demo.txt ls-stat-linkls-lils-stat-demo.txt ls-stat-linkls-lLls-stat-linkstat-c'%n %F %i %s %a %U'ls-stat-demo.txt ls-stat-linkstat-L-c'%n %F %i %s'ls-stat-linkfilels-stat-demo.txt namei-l/tmp/ls-stat-linkrm-fls-stat-demo.txt ls-stat-link本篇边界
- 不讲权限位如何判定能否读写(L03)
- 不讲
df/blockdev容量对比(L11) - 不讲 SELinux 策略(仅会看
ls -Z) - 不讲
find全选项(后文按需出现)
L02 模块小结
| 篇 | 收获 |
|---|---|
| L02-01 | 行首类型:-dlbc… |
| L02-02 | 名字 / inode / 数据块分离;目录项 |
| L02-03 | 硬链接与符号链接;ln/readlink/realpath |
| L02-04 | ls/stat/file/namei常用选项收口 |
下一篇预告
L03-01:《用户与组:uid、gid、id,以及 Android 上的 system/shell》— 进入 DAC,弄清「谁」在访问对象。