Linux教程 / 第 20 节
第2章:文件系统导航
掌握Linux目录结构,自如穿梭于文件系统
本章目标
- 理解Linux文件系统的层次结构
- 掌握绝对路径和相对路径的概念
- 熟练使用pwd、cd、ls命令导航
- 了解重要系统目录的作用
- 能够快速定位文件位置
2.1 Linux目录结构
2.1.1 树形目录结构
Linux使用树形目录结构,所有文件和目录都从根目录(/)开始。
/ (根目录)
├── bin/ (基本命令)
├── boot/ (启动文件)
├── dev/ (设备文件)
├── etc/ (配置文件)
├── home/ (用户家目录)
│ ├── jack/
│ └── alice/
├── lib/ (系统库)
├── media/ (可移动媒体)
├── mnt/ (临时挂载点)
├── opt/ (可选软件)
├── proc/ (进程信息)
├── root/ (root用户家目录)
├── run/ (运行时数据)
├── sbin/ (系统命令)
├── srv/ (服务数据)
├── sys/ (系统信息)
├── tmp/ (临时文件)
├── usr/ (用户程序)
│ ├── bin/
│ ├── lib/
│ ├── local/
│ └── share/
└── var/ (可变数据)
├── log/
├── mail/
└── www/
2.1.2 重要目录详解
系统核心目录
| 目录 | 说明 | 示例内容 |
|---|---|---|
/ | 根目录,所有目录的起点 | - |
/bin | 基本命令 (binary) | ls, cp, mv, cat |
/sbin | 系统管理命令 (system binary) | reboot, fdisk, ifconfig |
/boot | 启动文件 | 内核文件, grub配置 |
/dev | 设备文件 (device) | /dev/sda (硬盘), /dev/null |
/etc | 配置文件 (et cetera) | /etc/passwd, /etc/hosts |
/lib | 系统库文件 (library) | 共享库, 内核模块 |
用户相关目录
| 目录 | 说明 | 示例内容 |
|---|---|---|
/home | 普通用户家目录 | /home/jack, /home/alice |
/root | root用户家目录 | root用户的文件 |
/tmp | 临时文件 (temporary) | 临时数据,重启后清空 |
程序和数据目录
| 目录 | 说明 | 示例内容 |
|---|---|---|
/usr | 用户程序 (Unix System Resources) | 应用程序, 文档 |
/usr/bin | 用户命令 | gcc, python, vim |
/usr/local | 本地安装的软件 | 手动编译的软件 |
/opt | 可选软件包 (optional) | 第三方软件 |
/var | 可变数据 (variable) | 日志, 缓存, 邮件 |
/var/log | 日志文件 | 系统日志, 应用日志 |
/var/www | Web服务器文件 | 网站文件 |
特殊目录
| 目录 | 说明 | 特点 |
|---|---|---|
/proc | 进程信息 (process) | 虚拟文件系统,内存中 |
/sys | 系统信息 (system) | 硬件和内核信息 |
/run | 运行时数据 | 进程ID, socket文件 |
/media | 可移动媒体挂载点 | U盘, 光盘 |
/mnt | 临时挂载点 (mount) | 手动挂载的文件系统 |
2.1.3 Windows vs Linux 目录对比
| Windows | Linux | 说明 |
|---|---|---|
C:\ | / | 根目录 |
C:\Windows | /boot, /etc | 系统文件 |
C:\Program Files | /usr, /opt | 程序安装目录 |
C:\Users\username | /home/username | 用户目录 |
C:\Users\username\Desktop | ~/Desktop | 桌面 |
C:\Users\username\Documents | ~/Documents | 文档 |
C:\Temp | /tmp | 临时文件 |
关键区别:
- Windows使用
\分隔目录,Linux使用/ - Windows有多个盘符(C:, D:),Linux只有一个根目录
/ - Linux区分大小写,Windows不区分
2.2 路径概念
2.2.1 绝对路径 vs 相对路径
绝对路径 (Absolute Path)
- 从根目录
/开始的完整路径 - 无论在哪个目录,绝对路径都指向同一位置
- 以
/开头
/home/jack/documents/report.txt
/etc/nginx/nginx.conf
/var/log/syslog
相对路径 (Relative Path)
- 相对于当前目录的路径
- 不以
/开头 - 根据当前位置不同,指向的位置可能不同
documents/report.txt # 当前目录下的documents/report.txt
../alice/photos/pic.jpg # 上级目录的alice/photos/pic.jpg
./script.sh # 当前目录的script.sh
特殊路径符号
| 符号 | 含义 | 示例 |
|---|---|---|
/ | 根目录 | /home |
~ | 当前用户家目录 | ~/documents = /home/jack/documents |
. | 当前目录 | ./file.txt |
.. | 上级目录 | ../file.txt |
- | 上一个工作目录 | cd - |
示例对比
假设当前目录是 /home/jack/projects:
# 绝对路径
/home/jack/documents/report.txt # 明确指向这个文件
# 相对路径
../documents/report.txt # 相对于当前目录
~/documents/report.txt # 使用家目录简写
2.2.2 路径选择建议
使用绝对路径的场景:
- ✅ 脚本中引用文件
- ✅ 配置文件中的路径
- ✅ 跨目录操作
- ✅ 需要明确位置时
使用相对路径的场景:
- ✅ 同一目录树内操作
- ✅ 临时命令
- ✅ 可移植的脚本
- ✅ 快速导航
2.3 导航命令
2.3.1 pwd - 显示当前目录
pwd = Print Working Directory
# 显示当前目录
pwd
# 输出: /home/jack/projects
# 显示物理路径 (解析符号链接)
pwd -P
# 显示逻辑路径 (默认)
pwd -L
使用场景
# 确认当前位置
pwd
# 在脚本中获取当前目录
CURRENT_DIR=$(pwd)
echo "当前目录: $CURRENT_DIR"
2.3.2 cd - 切换目录
cd = Change Directory
基本用法
# 切换到指定目录 (绝对路径)
cd /home/jack/documents
# 切换到指定目录 (相对路径)
cd documents
# 切换到家目录
cd
# 或
cd ~
# 切换到上级目录
cd ..
# 切换到上上级目录
cd ../..
# 切换到上一个工作目录
cd -
# 切换到根目录
cd /
高级用法
# 切换到其他用户的家目录
cd ~alice
# 输出: /home/alice
# 使用环境变量
cd $HOME
cd $OLDPWD # 上一个目录
# 快速返回
cd - # 在两个目录间切换
实用技巧
# 技巧1: 使用Tab补全
cd /ho[Tab] # 自动补全为 /home/
cd Doc[Tab] # 自动补全为 Documents/
# 技巧2: 使用通配符
cd /var/log/nginx # 可以用Tab补全
# 技巧3: 快速跳转
cd ~ # 回家目录
cd - # 回上一个目录
cd .. # 上级目录
常见错误
# ❌ 错误: 目录不存在
cd /home/jack/notexist
# 输出: bash: cd: /home/jack/notexist: No such file or directory
# ❌ 错误: 不是目录
cd /etc/passwd
# 输出: bash: cd: /etc/passwd: Not a directory
# ❌ 错误: 没有权限
cd /root
# 输出: bash: cd: /root: Permission denied
2.3.3 ls - 列出目录内容
ls = List
基本用法
# 列出当前目录内容
ls
# 列出指定目录内容
ls /home
ls /etc
# 列出多个目录
ls /home /etc /var
常用选项
# -l: 详细列表 (long format)
ls -l
# 输出:
# drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 documents
# -rw-r--r-- 1 jack jack 123 Jan 13 09:30 file.txt
# -a: 显示所有文件 (包括隐藏文件)
ls -a
# 输出: . .. .bashrc .profile documents file.txt
# -h: 人类可读的文件大小 (human-readable)
ls -lh
# 输出:
# drwxr-xr-x 2 jack jack 4.0K Jan 13 10:00 documents
# -rw-r--r-- 1 jack jack 123 Jan 13 09:30 file.txt
# -t: 按修改时间排序 (time)
ls -lt
# -r: 反向排序 (reverse)
ls -lr
# -R: 递归列出子目录 (recursive)
ls -R
# -S: 按文件大小排序 (size)
ls -lS
# -i: 显示inode号
ls -li
组合选项
# 最常用的组合
ls -la # 详细列表 + 所有文件
ls -lh # 详细列表 + 人类可读大小
ls -lah # 详细列表 + 所有文件 + 人类可读大小
ls -lt # 详细列表 + 按时间排序
ls -ltr # 详细列表 + 按时间排序 + 反向 (最新的在最后)
输出解读
ls -l
# 输出:
drwxr-xr-x 2 jack jack 4096 Jan 13 10:00 documents
-rw-r--r-- 1 jack jack 123 Jan 13 09:30 file.txt
# 解析:
# drwxr-xr-x = 文件类型和权限
# 2 = 硬链接数
# jack = 所有者
# jack = 所属组
# 4096 = 文件大小(字节)
# Jan 13 10:00 = 修改时间
# documents = 文件名
文件类型标识
d = 目录 (directory)
- = 普通文件
l = 符号链接 (symbolic link)
b = 块设备 (block device)
c = 字符设备 (character device)
s = socket
p = 管道 (pipe)
使用通配符
# 列出所有.txt文件
ls *.txt
# 列出所有以test开头的文件
ls test*
# 列出所有.jpg和.png文件
ls *.jpg *.png
# 列出单个字符变化的文件
ls file?.txt # file1.txt, fileA.txt等
实用示例
# 查看最近修改的文件
ls -lt | head -10
# 查看最大的文件
ls -lS | head -10
# 只显示目录
ls -d */
# 显示文件数量
ls | wc -l
# 显示隐藏文件
ls -a
# 彩色输出 (大多数系统默认)
ls --color=auto
2.4 实战场景:定位项目文件位置
场景描述
你加入一个新项目,需要快速熟悉项目目录结构,找到配置文件和日志文件。
实战步骤
1. 确认当前位置
# 查看当前目录
pwd
# 输出: /home/jack
# 查看家目录内容
ls -la
# 输出:
# drwxr-xr-x 15 jack jack 4096 Jan 13 10:00 .
# drwxr-xr-x 3 root root 4096 Jan 10 08:00 ..
# -rw------- 1 jack jack 2847 Jan 13 09:30 .bashrc
# drwxr-xr-x 2 jack jack 4096 Jan 12 15:20 documents
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 projects
2. 进入项目目录
# 切换到项目目录
cd projects
pwd
# 输出: /home/jack/projects
# 查看项目列表
ls -l
# 输出:
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 my-web-app
# drwxr-xr-x 3 jack jack 4096 Jan 12 14:30 my-api
3. 探索项目结构
# 进入web项目
cd my-web-app
pwd
# 输出: /home/jack/projects/my-web-app
# 查看项目结构
ls -la
# 输出:
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 .
# drwxr-xr-x 5 jack jack 4096 Jan 13 10:00 ..
# drwxr-xr-x 8 jack jack 4096 Jan 13 09:00 .git
# -rw-r--r-- 1 jack jack 234 Jan 13 09:00 .gitignore
# -rw-r--r-- 1 jack jack 1234 Jan 13 09:00 README.md
# drwxr-xr-x 2 jack jack 4096 Jan 13 09:30 config
# drwxr-xr-x 3 jack jack 4096 Jan 13 09:30 src
# drwxr-xr-x 2 jack jack 4096 Jan 13 09:30 logs
# -rw-r--r-- 1 jack jack 567 Jan 13 09:00 package.json
# 递归查看目录树 (如果安装了tree命令)
tree -L 2
# 输出:
# .
# ├── config
# │ ├── database.yml
# │ └── app.yml
# ├── src
# │ ├── controllers
# │ ├── models
# │ └── views
# ├── logs
# │ ├── app.log
# │ └── error.log
# └── README.md
4. 查找配置文件
# 进入配置目录
cd config
pwd
# 输出: /home/jack/projects/my-web-app/config
# 查看配置文件
ls -l
# 输出:
# -rw-r--r-- 1 jack jack 456 Jan 13 09:00 app.yml
# -rw-r--r-- 1 jack jack 234 Jan 13 09:00 database.yml
# 使用绝对路径查看
ls -l /home/jack/projects/my-web-app/config
5. 查看日志文件
# 从配置目录返回项目根目录
cd ..
pwd
# 输出: /home/jack/projects/my-web-app
# 或使用绝对路径
cd /home/jack/projects/my-web-app
# 进入日志目录
cd logs
ls -lh
# 输出:
# -rw-r--r-- 1 jack jack 1.2M Jan 13 10:00 app.log
# -rw-r--r-- 1 jack jack 45K Jan 13 09:30 error.log
# 查看最近修改的日志
ls -lt
6. 快速导航练习
# 回到项目根目录
cd ..
# 或
cd ~/projects/my-web-app
# 查看源代码目录
ls -l src/
# 输出:
# drwxr-xr-x 2 jack jack 4096 Jan 13 09:30 controllers
# drwxr-xr-x 2 jack jack 4096 Jan 13 09:30 models
# drwxr-xr-x 2 jack jack 4096 Jan 13 09:30 views
# 进入controllers目录
cd src/controllers
pwd
# 输出: /home/jack/projects/my-web-app/src/controllers
# 返回上两级目录
cd ../..
pwd
# 输出: /home/jack/projects/my-web-app
# 使用cd -在目录间切换
cd logs
cd - # 返回上一个目录
cd - # 再次切换回logs
7. 创建导航别名 (可选)
# 在~/.bashrc中添加别名
echo 'alias proj="cd ~/projects/my-web-app"' >> ~/.bashrc
echo 'alias logs="cd ~/projects/my-web-app/logs"' >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
# 使用别名快速跳转
proj # 跳转到项目目录
logs # 跳转到日志目录
2.5 常用命令速查
| 命令 | 说明 | 示例 |
|---|---|---|
pwd | 显示当前目录 | pwd |
cd | 切换目录 | cd /home |
cd ~ | 回到家目录 | cd ~ |
cd .. | 上级目录 | cd .. |
cd - | 上一个目录 | cd - |
ls | 列出文件 | ls -la |
ls -l | 详细列表 | ls -l |
ls -a | 显示隐藏文件 | ls -a |
ls -h | 人类可读大小 | ls -lh |
ls -t | 按时间排序 | ls -lt |
2.6 常见问题与解决
Q1: 如何快速回到家目录?
# 方法1
cd
# 方法2
cd ~
# 方法3
cd $HOME
Q2: 如何查看隐藏文件?
# 隐藏文件以.开头
ls -a
# 或
ls -la
Q3: 如何知道某个路径是文件还是目录?
# 使用ls -l查看
ls -l /etc/passwd
# 输出: -rw-r--r-- ... (- 开头表示文件)
ls -l /etc
# 输出: drwxr-xr-x ... (d 开头表示目录)
# 或使用file命令
file /etc/passwd
# 输出: /etc/passwd: ASCII text
file /etc
# 输出: /etc: directory
Q4: 如何在两个目录间快速切换?
# 使用cd -
cd /var/log
cd /etc
cd - # 返回/var/log
cd - # 返回/etc
Q5: 路径太长怎么办?
# 使用Tab补全
cd /var/lo[Tab] # 自动补全
# 使用环境变量
export MYPROJECT=/home/jack/projects/my-web-app
cd $MYPROJECT
# 使用别名
alias proj='cd /home/jack/projects/my-web-app'
proj
2.7 本章小结
本章学习了Linux文件系统导航:
✅ 目录结构: 理解Linux树形目录结构
✅ 重要目录: 了解/home、/etc、/var等目录的作用
✅ 路径概念: 掌握绝对路径和相对路径
✅ 导航命令: 熟练使用pwd、cd、ls命令
✅ 实战练习: 快速定位项目文件
关键要点
- Linux目录从根目录
/开始,呈树形结构 - 绝对路径以
/开头,相对路径不以/开头 ~代表家目录,.代表当前目录,..代表上级目录pwd查看当前位置,cd切换目录,ls列出内容- 善用Tab补全和
cd -提高导航效率
下一步学习
- 第3章: 文件与目录基本操作 - 学习创建、删除、复制、移动文件
2.8 练习题
- 基础练习: 使用cd和ls浏览/etc、/var/log、/usr/bin目录
- 进阶练习: 从/home/user/documents导航到/var/log,使用绝对路径和相对路径两种方式
- 实战练习: 找出/var/log目录中最大的5个日志文件
- 挑战练习: 创建一个脚本,自动记录你最常访问的10个目录
🎉 恭喜!你已经掌握了Linux文件系统导航!
继续学习 → 第3章:文件与目录基本操作