ls -l每行第一个字符:- 普通、d 目录、l 链接、b 或 c 设备。
约 1287 字大约 4 分钟
2026-05-14
Linux 有句老话:“一切皆文件。”目录是文件,磁盘设备是文件,进程间通信的管道和 socket 也是文件。ls -l 每行开头的那个字符,就是在告诉你“这到底是什么类型的文件”。读懂它,很多诡异现象就有了解释。
区分普通文件、目录、符号链接、设备文件、socket、管道,读懂 ls -l 第一个字符,理解“一切皆文件”。
ls -l每行第一个字符:- 普通、d 目录、l 链接、b 或 c 设备。
file name不看后缀,按内容判断是文本、二进制、压缩包还是脚本。
stat name类型、大小、inode、权限、三个时间戳一次看全。
find . -type l-type 还可用 f 文件、d 目录、p 管道、s socket。
ls -l 第一个字符:类型标识-rw-r--r-- 1 me me 1.2K config.yml
drwxr-xr-x 2 me me 4.0K logs
lrwxrwxrwx 1 me me 11 current -> releases/v2每行最前面那个字符就是类型:
| 字符 | 类型 | 说明 |
|---|---|---|
- | 普通文件 | 文本、二进制、图片,最常见 |
d | 目录 | 本质上是“文件名到 inode 的映射表” |
l | 符号链接 | 指向另一个路径的“快捷方式” |
b | 块设备 | 按块读写,如硬盘 /dev/sda |
c | 字符设备 | 按字符流读写,如 /dev/null、终端 |
p | 命名管道 | 进程间单向通信 |
s | socket | 进程间双向通信,如 /var/run/docker.sock |
后面九个字符是权限,见 文件权限模型。
符号链接(软链接)里存的是一个路径字符串,访问它时系统转去读那个路径。这带来一个特性:如果目标被删除或移动,链接就变成“悬空链接”,ls 里还在,但 cat 会报 “No such file or directory”。
ls -l current # current -> releases/v2
readlink current # 看它指向哪里
readlink -f current # 一路解析到最终的真实文件部署系统常用一个 current 软链接指向最新版本目录,回滚时只改链接指向。详细机制见 inode、硬链接与软链接。
file:不看后缀,看内容Linux 不靠扩展名判断文件用途。一个没有后缀的文件可能是脚本,一个叫 data.txt 的文件可能其实是压缩包。file 命令读取文件开头的特征字节来判断:
file /bin/ls # ELF 64-bit executable
file photo # JPEG image data
file script # Bourne-Again shell script下载到一个打不开的文件时,先 file 一下,往往直接看出“它根本不是你以为的格式”。
这几类“特殊文件”不存数据,而是通信接口:
/dev/null:字符设备,写进去的一切都被丢弃,常用于 cmd > /dev/null/dev/sda:块设备,代表一整块硬盘/var/run/docker.sock:socket 文件,客户端通过它和 Docker 守护进程通信平时不用直接操作它们,但在 ls 里看到 b、c、s 开头时,要知道“这不是普通文件,别拿它当数据文件处理”。
操作链接和特殊文件要看清对象
rm 一个符号链接,删的是链接本身,不碰目标。复制时,cp 默认跟随链接,cp -d 或 cp -a 才保留链接本身。设备文件更要小心:误对 /dev/sda 这类块设备执行写操作可能损坏整块磁盘。
| 误区 | 更稳妥的做法 |
|---|---|
| 靠扩展名判断文件是什么 | 用 file 按内容判断,Linux 不依赖后缀 |
| 把符号链接当成真实文件来移动、备份 | 用 readlink -f 看清真实目标;cp 注意是否跟随链接 |
| 看到悬空链接以为文件还在 | ls 显示链接不代表目标存在,cat 才会暴露 |
把 b、c、s 特殊文件当普通数据文件处理 | 它们是设备和通信接口,误操作设备文件可能损坏磁盘 |
版权归属:Shuo Liu