Linux(CentOS)系统管理入门笔记(第三期)——文件系统(上篇):目录结构与路径导航——FHS 与 cd/pwd/ls
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
引言:文件系统,Linux 世界的“城市地图”
想象你刚搬到一座陌生的城市。这座城市规划得井井有条:住宅区、商业区、工业区、政府办公区、临时活动区各归其位。你不需要记住每一栋楼的精确坐标,只要知道“商业区在城东”“政府大院在市中心”,就能快速找到银行、邮局或派出所。
Linux 的文件系统就是这座“城市”。它的目录结构由 FHS(文件系统层次结构标准) 统一规划,确保了无论在哪个发行版上,配置文件都在 /etc,日志文件都在 /var/log,用户数据都在 /home。这套规范让 Linux 管理员可以“跨发行版迁徙”而不会迷路。
但仅有“地图”还不够,你还需要学会“导航”——当前在哪个位置?怎么去另一个目录?有哪些文件?它们是什么时候创建的?本期,我们将从根目录 / 出发,走遍 Linux 的“主要街区”,同时掌握 pwd、cd、ls、tree、stat、touch 六位“导航神器”。读完这一期,你将拥有在 Linux 文件王国中精准定位、自由穿行的能力。
目录
- FHS:Linux 目录世界的“宪法”
- 根目录下的“十大地标”
- 路径导航基石:pwd 与 cd
- 目录内容查看:ls 的十八般武艺
- 目录可视化:tree 命令
- 文件元数据:stat 与 touch
- 总结与速查手册
1. FHS:Linux 目录世界的“宪法”
1.1 为什么需要 FHS?
Linux 是开源的,任何人都可以下载内核源码,制作自己的发行版。如果没有统一规范,A 发行版把配置文件放在 /cfg,B 发行版放在 /configs,C 发行版放在 /etc——那系统管理员每次换发行版都要重新学习,软件包在安装时也无法预知配置路径,整个生态将陷入混乱。
为了解决这个问题,FHS(Filesystem Hierarchy Standard,文件系统层次结构标准) 应运而生。它采用树形结构组织文件,明确定义了:
- 根目录
/下各个一级目录的用途(例如/etc必须放配置文件,/bin和/sbin必须放可执行文件) /usr和/var两个关键目录的子目录规范(例如/var/log放日志,/usr/share放共享数据)
💡 白话理解:FHS 就像是城市规划局颁布的“土地使用规范”——市中心(
/)周围,哪块地建住宅、哪块地建工厂、哪块地做公园,都有明确规定。任何开发商(发行版制作者)都必须遵守。
1.2 FHS 的两层规范
| 规范层级 | 适用范围 | 典型示例 |
|---|---|---|
| 第一层 | / 下的一级目录 | /etc(配置)、/bin(命令)、/home(用户数据) |
| 第二层 | /usr 和 /var 的子目录 | /usr/bin(用户命令)、/var/log(日志) |
FHS 并非一成不变,它会随着 Linux 生态演进定期更新。但近二十年来,其核心框架已非常稳定,成为所有主流发行版(Red Hat、Debian、Ubuntu、SUSE)共同遵守的规范。
2. 根目录下的“十大地标”
让我们从根目录 / 出发,逐个了解最重要的系统目录。你可以用以下命令亲自查看:
# 查看根目录下的一级目录
ls -l /
2.1 一级目录详解
| 目录 | 用途 | 关键特征 | 比喻 |
|---|---|---|---|
/usr | 系统软件与库的安装位置 | 只读(理论),可被多台机器共享 | 城市的“商业区”——所有商店、图书馆都在这 |
/etc | 系统配置文件 | 永久、静态、本地特定 | 城市的“政府大院”——规章制度都存于此 |
/var | 可变数据(日志、缓存、数据库) | 永久存储,但内容会增长/变化 | 城市的“档案馆+物流中心”——不断有新增记录 |
/run | 运行时数据(PID 文件、锁文件) | 非永久,重启即清空 | 城市的“临时指挥所”——只在当次开机有效 |
/home | 普通用户的主目录 | 每个用户一个子目录,如 /home/laoma | 城市的“住宅小区”——每个住户一个门牌号 |
/root | root 管理员的主目录 | 不在 /home 下,独立存放 | 城市“市长官邸”——独立于普通住宅区 |
/tmp | 全局临时文件空间 | 全局可写,10 天自动清理 | 城市的“临时堆场”——用完即走 |
/var/tmp | 长期临时文件 | 30 天自动清理 | 城市的“中转仓库”——比临时堆场保留更久 |
/boot | 启动引导文件(内核、GRUB) | 系统启动必需,通常单独分区 | 城市的“地铁总控室”——启动整个交通系统的关键 |
/dev | 设备文件(硬盘、终端、随机数) | 特殊文件,供系统访问硬件 | 城市的“各种管道接口”——通往硬件设备的通道 |
2.2 深入解读:几个容易混淆的目录
/usr — 不只是“用户”目录
很多新手以为 /usr 是“user”的缩写,存放用户数据。这是错的。/usr 是 Unix System Resources 的缩写,存放的是系统级的软件、库和文档,是所有用户共享的只读数据。
# /usr 的子目录结构
/usr/bin/ # 用户命令(普通用户可执行)
/usr/sbin/ # 系统管理命令(通常需要 root 权限)
/usr/lib/ # 32 位库文件
/usr/lib64/ # 64 位库文件(CentOS 7 默认)
/usr/local/ # 本地编译安装的软件(默认路径 /usr/local/bin)
/usr/share/ # 架构无关的共享数据(文档、图标、时区等)
/usr/src/ # 源码存放位置
/etc — 配置中心
/etc 存放几乎所有的系统级配置文件。无论是什么软件(网络、安全、服务),它的全局配置通常都在这里:
# 几个关键配置文件
/etc/hosts # 主机名与 IP 映射(手动 DNS 解析)
/etc/hostname # 系统主机名
/etc/fstab # 文件系统挂载表(开机自动挂载)
/etc/passwd # 用户账户信息
/etc/shadow # 用户密码信息(加密)
/etc/sudoers # sudo 权限配置
/etc/yum.repos.d/ # yum 软件源配置目录
/var — 动态数据的“大本营”
/var 存放的是运行时会发生变化的永久数据——它会增长、被修改、被轮转,但重启后数据依然存在。
/var/log/ # 系统日志(messages、secure、cron 等)
/var/cache/ # 应用程序缓存
/var/spool/ # 打印队列、邮件队列
/var/lib/ # 数据库文件(MySQL、PostgreSQL 等)
/var/tmp/ # 长期临时文件(30 天清理)
/tmp vs /var/tmp vs /run — 三大临时区
| 目录 | 清理策略 | 用途 | 重启后 |
|---|---|---|---|
/tmp | 10 天未访问/未修改则自动删除 | 短期临时文件(如编译器临时输出) | 清空 |
/var/tmp | 30 天未访问/未修改则自动删除 | 长期临时文件(如编辑器备份文件) | 保留 |
/run | 不清理(但重启即消失) | 进程运行时数据(PID 文件、socket) | 清空 |
⚠️ 常见误区:有些新手会直接往
/tmp里放重要的长期数据,结果 10 天后发现文件“不翼而飞”——这不是系统故障,是 FHS 的清理策略在正常工作。重要的东西请放/home或/var。
2.3 静态 vs 动态 vs 运行时 对比
| 维度 | /usr | /etc | /var | /run |
|---|---|---|---|---|
| 内容特征 | 静态、只读 | 静态、可配置 | 动态、增长 | 瞬时、临时 |
| 跨机器共享 | ✅ 可以(NFS 挂载) | ❌ 不建议(本地特定) | ❌ 不建议 | ❌ 不可以 |
| 重启后 | 完整保留 | 完整保留 | 完整保留 | 清空重建 |
| 典型内容 | 二进制程序、库文件 | 配置文件 | 日志、数据库、缓存 | PID 文件、锁文件 |
3. 路径导航基石:pwd 与 cd
有了“城市地图”,现在我们来学“导航”。三个最基础的命令构成了路径操作的核心。
3.1 绝对路径与相对路径
在开始命令之前,先厘清一个核心概念:
| 路径类型 | 定义 | 示例 | 识别方法 |
|---|---|---|---|
| 绝对路径 | 以根目录 / 开头,从根开始描述位置 | /home/laoma/file.txt | 第一个字符是 / |
| 相对路径 | 不以 / 开头,相对于当前工作目录 | ./file.txt、../etc/hosts | 第一个字符不是 / |
相对路径的两个特殊符号:
| 符号 | 含义 | 示例 |
|---|---|---|
. | 当前目录 | cd .(原地不动) |
.. | 上一级目录(父目录) | cd ..(回到上一级) |
💡 最佳实践:在命令行交互中,相对路径更方便(省去大量输入);在脚本和配置文件中,优先使用绝对路径,避免因脚本在未知位置执行而找不到目标文件。
3.2 pwd — 我在哪?
pwd(Print Working Directory)显示当前所在目录的绝对路径,是你时刻需要的“定位仪”。
[laoma@centos7 ~]$ pwd
/home/laoma
[laoma@centos7 ~]$ cd /usr/share/doc/
[laoma@centos7 doc]$ pwd
/usr/share/doc
3.3 cd — 我要去哪?
cd(Change Directory)是切换目录的唯一命令。
基础用法
# 切换到绝对路径
[laoma@centos7 ~]$ cd /usr/bin
[laoma@centos7 bin]$ pwd
/usr/bin
# 切换回上一个目录(超级实用!)
[laoma@centos7 bin]$ cd -
/usr/share/doc
[laoma@centos7 doc]$ pwd
/usr/share/doc
# 直接 cd(不带参数)→ 回到用户家目录
[laoma@centos7 doc]$ cd
[laoma@centos7 ~]$ pwd
/home/laoma
# cd ~ 同样回到家目录
[laoma@centos7 ~]$ cd /etc
[laoma@centos7 etc]$ cd ~
[laoma@centos7 ~]$ pwd
/home/laoma
利用 .. 向上导航
# 从深层目录逐级向上
[laoma@centos7 ~]$ cd /usr/share/doc/at-spi2-core-2.28.0/
[laoma@centos7 at-spi2-core-2.28.0]$ pwd
/usr/share/doc/at-spi2-core-2.28.0
# 返回上一级(到 /usr/share/doc)
[laoma@centos7 at-spi2-core-2.28.0]$ cd ..
[laoma@centos7 doc]$ pwd
/usr/share/doc
# 连续向上两级(到 /usr/share)
[laoma@centos7 doc]$ cd ../../
[laoma@centos7 share]$ pwd
/usr/share
# 从深层目录直接跳到 /etc/yum(利用多个 ..)
[laoma@centos7 ~]$ cd /usr/share/doc/at-spi2-core-2.28.0/
[laoma@centos7 at-spi2-core-2.28.0]$ cd ../../../../etc/yum
[laoma@centos7 yum]$ pwd
/etc/yum
3.4 何时用绝对路径,何时用相对路径?
| 场景 | 推荐 | 原因 |
|---|---|---|
| 交互式操作(手敲命令) | 相对路径 | 输入少、效率高 |
| Shell 脚本 | 绝对路径 | 脚本可能在不同目录被调用,相对路径会错位 |
| 配置文件引用(如 fstab) | 绝对路径 | 系统启动时工作目录未定义,必须用绝对路径 |
| 深度嵌套目录 | 绝对路径(从根写起) | 避免一串 ../../../../ 让人眼花缭乱 |
4. 目录内容查看:ls 的十八般武艺
ls 是 Linux 中最常用的命令之一。它的核心功能是列出目录内容,但通过不同选项的组合,它可以展示文件权限、大小、时间、排序等丰富信息。
4.1 基础用法
# 列出当前目录所有非隐藏文件
ls
# 列出指定目录内容
ls /etc/yum
# 列出所有文件(包括 . 开头的隐藏文件)
ls -a
# 单列输出(每个文件占一行)
ls -1
# 输出:
# 公共
# 模板
# 视频
# 图片
# 文档
# 下载
# 音乐
# 桌面
4.2 长列表模式:-l —— 信息密度之王
[laoma@centos7 ~]$ ls -l /etc/hosts
-rw-r--r--. 1 root root 197 11月 3 14:35 /etc/hosts
逐个字段解读:
| 字段 | 示例值 | 含义 |
|---|---|---|
| 第1位 | - | 文件类型(-普通文件、d目录、l软链接) |
| 第2-4位 | rw- | 文件所有者(root)的权限:读+写 |
| 第5-7位 | r-- | 文件所属组(root)的权限:只读 |
| 第8-10位 | r-- | 其他人(other)的权限:只读 |
| 第2字段 | 1 | 硬链接数 |
| 第3字段 | root | 文件所有者(user owner) |
| 第4字段 | root | 文件所属组(group owner) |
| 第5字段 | 197 | 文件大小(字节) |
| 第6-8字段 | 11月 3 14:35 | 最近修改时间 |
| 第9字段 | /etc/hosts | 文件名 |
4.3 排序与筛选选项
ls 默认按文件名字母顺序正向排序。以下几个选项在日常运维中极高频:
# 按时间排序(最新在前)—— 找最近改过的文件
ls -lt
# 按时间反向排序(最旧在前)
ls -ltr
# 只查看目录本身的信息(不列出目录内容)
ls -ld /etc/yum
# 输出:drwxr-xr-x. 6 root root 100 12月 13 10:42 /etc/yum
# 按大小排序(配合 -h 人类可读)
ls -lSh
# 递归查看子目录内容
ls -R /etc/yum
4.4 ls 常用选项速查表
| 选项 | 作用 | 示例场景 |
|---|---|---|
-l | 长格式显示(权限、大小、时间) | 查看文件详细信息 |
-a | 显示所有文件(含隐藏文件 . 开头) | 查看配置文件、环境变量文件 |
-A | 显示所有文件(不含 . 和 ..) | 同上,但更干净 |
-h | 人类可读的大小(K/M/G) | 查看大文件时配合 -lh |
-R | 递归列出子目录内容 | 查看完整的目录树结构 |
-d | 只显示目录本身(不展开内容) | 查看目录自身的权限和属性 |
-t | 按修改时间排序(最新优先) | 定位最近修改的文件 |
-r | 反向排序 | 配合 -t 看最旧文件 |
-S | 按文件大小排序 | 找占用空间最大的文件 |
-1 | 单列输出 | 适合脚本处理或在终端中清晰展示 |
5. 目录可视化:tree 命令
ls -R 虽然能递归显示目录内容,但输出格式不够直观。tree 命令以树形结构展示目录层级,一目了然。
5.1 安装 tree
CentOS 7 默认不安装 tree,需要手动安装:
[root@centos7 ~]# yum install -y tree
5.2 基本用法
[laoma@centos7 ~]$ tree /etc/yum
/etc/yum
├── fssnap.d
├── pluginconf.d
│ ├── fastestmirror.conf
│ └── langpacks.conf
├── protected.d
│ └── systemd.conf
├── vars
│ ├── contentdir
│ └── infra
└── version-groups.conf
4 directories, 6 files
5.3 常用选项
# 限制显示层级(只看两层)
tree -L 2 /etc/yum
# 只显示目录(不显示文件)
tree -d /etc/yum
# 显示完整路径
tree -f /etc/yum
💡 实用场景:当你想快速了解一个陌生目录的结构时,
tree -L 2是最佳选择——它不会像ls -R那样输出成百上千行,而是给你一个“概览图”。
6. 文件元数据:stat 与 touch
6.1 stat —— 查看文件的“身份证”
stat 命令显示文件的元数据(metadata)——即“关于文件的数据”,而非文件内容本身。
[laoma@centos7 ~]$ stat /etc/fstab
文件:"/etc/fstab"
大小:541 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:67160130 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:etc_t:s0
最近访问:2022-12-14 11:09:49.628179033 +0800
最近更改:2022-12-13 10:38:44.625179973 +0800
最近改动:2022-12-13 10:53:38.563774524 +0800
创建时间:-
三种时间戳的区别(核心知识)
| 时间戳 | 英文术语 | 更新时机 | 查看选项(ls) |
|---|---|---|---|
| 访问时间 | Access Time (atime) | 读取文件内容时更新(如 cat、less) | ls -lu |
| 修改时间 | Modify Time (mtime) | 修改文件内容时更新(如 echo >>、vim 保存) | ls -l(默认) |
| 状态改变时间 | Change Time (ctime) | 修改文件元数据时更新(如 chmod、chown、mv) | ls -lc |
⚠️ 常见误区:很多初学者把“修改时间”和“状态改变时间”混为一谈。记住——
mtime变的是内容,ctime变的是属性。mv命令不改变文件内容,但会改变父目录的元数据,所以文件本身的ctime会更新,但mtime不变。
6.2 touch —— 创建文件与更新时间戳
touch 有两个核心功能:
- 文件不存在时 → 创建一个空文件
- 文件存在时 → 将其
atime和mtime更新为当前时间
创建空文件
# 创建单个文件
[laoma@centos7 ~]$ touch file1.txt
[laoma@centos7 ~]$ ls -l file1.txt
-rw-rw-r--. 1 laoma laoma 0 7月 7 15:30 file1.txt
# 批量创建多个文件
[laoma@centos7 ~]$ touch file-{1..5}.txt
[laoma@centos7 ~]$ ls
file-1.txt file-2.txt file-3.txt file-4.txt file-5.txt
更新时间戳
# 将文件时间戳更新为当前时间
[laoma@centos7 ~]$ stat file1.txt | grep 最近
最近访问:2026-07-07 15:30:00.000000000 +0800
最近更改:2026-07-07 15:30:00.000000000 +0800
# 等待几秒后执行 touch
[laoma@centos7 ~]$ touch file1.txt
[laoma@centos7 ~]$ stat file1.txt | grep 最近
最近访问:2026-07-07 15:32:15.000000000 +0800
最近更改:2026-07-07 15:32:15.000000000 +0800
高级用法:参考时间戳
# 使用 -r 选项,将文件 A 的时间戳复制给文件 B
[laoma@centos7 ~]$ touch -r file1.txt file2.txt
# 使用 -t 选项,手动指定时间戳 [[CC]YY]MMDDhhmm[.ss]
[laoma@centos7 ~]$ touch -t 202401011200.00 oldfile.txt
[laoma@centos7 ~]$ ls -l oldfile.txt
-rw-rw-r--. 1 laoma laoma 0 1月 1 2024 oldfile.txt
-c 选项:仅更新时间戳,不创建文件
# 文件不存在时不创建
[laoma@centos7 ~]$ touch -c non-existent-file.txt
[laoma@centos7 ~]$ ls non-existent-file.txt
ls: 无法访问non-existent-file.txt: 没有那个文件或目录
💡 实用场景:
- 用
touch *.log批量更新日志文件时间戳。- 用
touch -r将配置文件的时间戳标准化,便于版本对比。- 用
touch -t创建具有特定时间戳的文件,用于测试脚本的时间逻辑。
7. 总结与速查手册
7.1 核心知识点一览
| 主题 | 关键点 |
|---|---|
| FHS | 文件系统层次结构标准,统一了 Linux 目录布局 |
| 一级目录 | /usr(软件)、/etc(配置)、/var(动态数据)、/home(用户)、/tmp(临时) |
| 绝对路径 | 以 / 开头,从根开始描述位置 |
| 相对路径 | 不以 / 开头,相对于当前目录,. 和 .. 是核心符号 |
| pwd | 显示当前工作目录的绝对路径 |
| cd | 切换目录,cd - 返回上一目录,cd ~ 回家 |
| ls | -l 长格式、-a 显示隐藏、-t 时间排序、-R 递归 |
| tree | 树形结构展示目录,需安装 |
| stat | 显示文件的三个时间戳:atime/mtime/ctime |
| touch | 创建空文件或更新时间戳,-r 参考模式、-t 指定时间 |
7.2 一级目录速查卡
| 目录 | 一句话作用 | 关键特性 |
|---|---|---|
/usr | 系统软件与库 | 只读、可共享 |
/etc | 系统配置文件 | 永久、本地特定 |
/var | 动态数据(日志/缓存/数据库) | 永久、可增长 |
/run | 运行时数据(PID/锁文件) | 重启即清空 |
/home | 普通用户家目录 | 每个用户独立子目录 |
/root | root 用户家目录 | 独立于 /home |
/tmp | 全局临时文件 | 10 天自动清理、全局可写 |
/var/tmp | 长期临时文件 | 30 天自动清理 |
/boot | 启动文件 | 通常独立分区 |
/dev | 设备文件 | 特殊文件、访问硬件接口 |
7.3 本章命令速查表
| 命令 | 最常用法 | 作用 |
|---|---|---|
pwd | pwd | 显示当前绝对路径 |
cd | cd /etc、cd -、cd ~ | 切换目录 |
ls | ls -la、ls -lt、ls -R | 列出目录内容 |
tree | tree -L 2 /etc | 树形展示目录结构 |
stat | stat /etc/hosts | 查看文件元数据与时间戳 |
touch | touch file、touch -r ref.txt target.txt | 创建文件或更新时间戳 |
7.4 常见错误排查指南
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
-bash: cd: /xxx: No such file or directory | 目标目录不存在 | 先用 ls 确认路径拼写,注意大小写敏感 |
Permission denied | 无权限进入该目录或查看文件 | 使用 ls -ld 查看权限,联系管理员 |
command not found | 命令不存在或路径不在 PATH 中 | 使用 which 命令名 检查,或用绝对路径执行 |
ls: cannot access 'xxx': Permission denied | 对父目录没有执行权限(x) | 检查父目录权限,用 chmod +x 修复(需授权) |
| 文件“突然消失” | 文件放在 /tmp 超过 10 天被自动清理 | 重要文件放 /home 或 /var |
cd .. 无法回到预期的目录 | 当前目录是软链接,cd .. 回到链接所在的父目录而非目标父目录 | 使用 cd -P .. 或先 cd -P 解析软链接 |
7.5 思考与拓展(原课后作业转化)
- 为什么 Linux 不像 Windows 那样有 C:、D: 盘符?
→ Linux 采用单一根目录树,所有存储设备都挂载(mount)到树中的某个目录(如/mnt/data)下。这种设计更统一、更灵活,且与“一切皆文件”哲学一致。 /usr/bin和/usr/local/bin有什么区别?
→/usr/bin由系统包管理器(如 yum/dnf)管理,更新软件包时会覆盖;/usr/local/bin供用户手动编译安装的软件使用,不会被系统包管理器覆盖。按 FHS 标准,本地编译的软件应当放在/usr/local下。- 什么时候
cd命令后不加任何参数?
→ 不加参数时,cd会切换到用户的家目录($HOME),等价于cd ~。如果当前已在根目录,cd不会有任何变化。 - 如何在不进入目录的情况下,查看某个目录自身的详细信息(而非其内容)?
→ 使用ls -ld 目录名。-d选项是关键,否则ls会展开目录内容。 stat中的三个时间戳,哪些会被touch命令更新?
→ 默认情况下,touch更新 atime(访问时间) 和 mtime(修改时间),而 ctime(状态改变时间) 会被系统自动更新为当前时间(因为文件元数据本身发生了变化)。
7.6 生产环境最佳实践
| 场景 | 建议 |
|---|---|
| 日常导航 | 多用 cd - 在“当前目录”和“上一个目录”之间快速切换 |
| 脚本编写 | 文件路径一律使用绝对路径,避免因脚本执行位置变化而出错 |
| 查找最近修改的文件 | `ls -lt |
| 理解系统目录 | 定期用 tree -L 2 / 熟悉根目录结构,做到“脑中有图” |
| 临时文件管理 | 永远不要把重要数据放在 /tmp 或 /var/tmp,它们会被自动清理 |
| 文件时间戳调试 | 用 touch -t 创建指定时间的测试文件,验证脚本的时间逻辑 |
下期预告:掌握了文件系统的“地图”和“导航”,下一期我们将进入文件的增删改查实操——用
cp复制、mv移动/重命名、mkdir创建目录、rm删除文件/目录,以及软链接和硬链接的区别与实战。同时,我们还会学习 Shell 通配符(\*、?、[]、{}) 的批量匹配技巧——让你的文件操作效率提升一个数量级。敬请期待第四期!
1880

被折叠的 条评论
为什么被折叠?



