Linux设备与存储精读 · L02-04 | `stat` / `ls` 常用选项精读:读懂一个路径

📅 2026/7/31 9:54:02 👁️ 阅读次数 📝 编程学习
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 模块小结
    • 下一篇预告

本篇目标

lsstat常用选项练到会选、会读;并用filenamei补齐「内容线索」与「路径逐级解析」。学完后,对任意路径能快速回答:类型、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 -fstat真身。

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–)
%iinode
%h硬链接数
%s大小(字节)
%b已分配块数(实现相关)
%U%u属主名 / uid
%G%g属组名 / gid
%x%y%zatime / 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/tmp

6. 组合拳:一条路径怎么读透

以 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/gidid对照
-R递归小目录树;大树慎用
-1单列脚本处理名单
-t按 mtime 排序找最新日志/产物
-S按大小排序找大文件
-r反转排序-t/-S组合
-F类型后缀提示快速扫目录
-p目录名后加/同上(更克制)
-ZSELinux 上下文确认「还有标签」常见视系统
--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不打印路径前缀脚本视实现
-iMIME分类文件视实现
-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 -lLstat+stat -L
inodels -li
namei逐级ls -ld
完整stat -c/file/namei远程服务器

检查清单

  • 会用-ld/-lL/-li/-lh/-ln/-la/-lR(知其风险)
  • 会用statstat -Lstat -c '%n %F %i %s %a'
  • 会用stat -f作为文件系统信息入口
  • 会用file看普通文件/镜像线索
  • 会用namei -l或逐级ls -ld定位路径中哪一层有问题
  • 对 by-name 能分清「链接自身」与「目标块设备」两套输出

练习

判断题(对 / 错)

  1. ls -l /datals -ld /data显示的是同一类信息。
  2. ls -lL作用于 by-name 时,便于查看目标块设备的类型与权限。
  3. stat默认一定跟随符号链接到目标。
  4. inode 号应当跨/data/system比较是否相等,以判断是否同一文件。
参考答案
  1. 错。前者列内容,后者列目录自身。
  2. 对。
  3. 错。默认看链接自身;跟随用-L
  4. 错。inode 只在同一文件系统内有意义(L02-02)。

选项填空

  1. 只看挂载点/data自己的类型与权限:ls ___ /data
  2. 脚本要打印「路径、类型名、inode、字节大小」:stat -c '________' path
  3. 跟随 by-name 查看目标:stat ___ pathls ___ path
参考答案
  1. -ld
  2. '%n %F %i %s'(等价字段顺序可调整)
  3. -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
  1. /data的类型与属主属组?
  2. by-name 未跟随时,%s为 20 更可能表示什么?
  3. 跟随后类型与权限八进制是什么?
参考答案
  1. 目录;root:system。
  2. 符号链接目标字符串长度(约 20 字节),不是块设备容量。
  3. 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-04ls/stat/file/namei常用选项收口

下一篇预告

L03-01:《用户与组:uid、gid、id,以及 Android 上的 system/shell》— 进入 DAC,弄清「谁」在访问对象。