阶段三 · 文件与系统命令

文件系统导航

1. Linux 文件系统树

在学具体命令之前,先建立一个关键认知: Linux 的文件系统是一棵倒置的树.

/ 是所有路径的起点:

/                           ← 根目录(root),一切从这里开始
├── bin/ ← 基础命令(ls, cat, cp...)
├── etc/ ← 系统配置
├── home/ ← 用户家目录
│ └── yutong/ ← 家目录(~)
│ ├── note/
│ │ └── mine/ ← 当前所在位置
│ └── .zshrc ← 隐藏文件(以 . 开头)
├── tmp/ ← 临时文件(重启清空)
├── usr/
│ ├── bin/ ← 更多用户命令
│ └── local/ ← 用户自行安装的软件
└── var/ ← 可变数据(日志, 缓存)

关键概念:

  • 只有一个根: 所有路径都从 / 开始. 没有 Windows 的 C:\ D:\ 之分--所有硬盘, U 盘, 网络存储都挂载到根下的某个目录
  • 一切皆文件: 目录是文件,硬盘是文件(/dev/disk0),进程信息是文件(/proc),甚至当前终端也是文件(/dev/pts/2)
  • 隐藏文件: 以 . 开头的文件或目录不会在 ls 默认输出中显示
  • 大小写敏感: Note.txtnote.txt 是两个不同的文件

2. pwd: 我在哪?

pwd(Print Working Directory)是最简单的命令--打印当前工作目录的绝对路径. 在目录树中的 "当前位置" 就是工作目录.

$ pwd
/Users/yutong/note/mine

$ cd /tmp
$ pwd
/tmp

注意: pwd 有两个变体--Shell 内置的 pwd/bin/pwd. 在涉及符号链接(symlink)时行为不同:

# 假设 /tmp/link → /Users/yutong/note
$ cd /tmp/link
$ pwd # Shell 内置:显示 "逻辑上" 在哪
/tmp/link
$ /bin/pwd # 外部命令:显示 "物理上" 的真实路径
/Users/yutong/note

日常使用用 Shell 内置的 pwd 就够了. 需要真实物理路径时加 -P 标志.

3. 绝对路径与相对路径

命令行里,可以用两种方式描述一个文件的位置--就像可以说 "北京市朝阳区 XX 路 100 号"(绝对),也可以说 "出门右转第二个路口"(相对).

3.1 绝对路径

从根 / 开始写完整路径. 无论当前在哪个目录,绝对路径都指向同一个位置.

$ cat /Users/yutong/.zshrc     # 从根写起,在哪执行都一样
$ ls /usr/local/bin # 不受当前目录影响

3.2 相对路径

从当前工作目录出发. 以 ./ 开头(或直接写名字,省略 ./).

$ pwd
/Users/yutong/note
$ cd mine # 相对路径 - 进入当前目录下的 mine/
$ cat 05-环境变量-PATH与配置文件.html # 等价于 ./05-环境变量-PATH与配置文件.html

3.3 特殊目录符号

符号 含义 例子
. 当前目录 ./script.sh 执行当前目录下的脚本
.. 上一级目录(父目录) cd .. 回到上级
~ 当前用户的家目录 cd ~ 回 home,ls ~/Downloads
~user 指定用户的家目录 cd ~root 去 root 的家目录
- 上一次的工作目录 cd - 回到刚才在的那个目录
$ pwd
/Users/yutong/note/mine
$ cd .. # 回上级
$ pwd
/Users/yutong/note
$ cd - # 回刚才的地方
/Users/yutong/note/mine
$ cd ~ # 回家
$ pwd
/Users/yutong

4. cd: 在目录树中移动

cd(Change Directory)是最频繁使用的命令. 它是 Shell 内置命令--没有 /bin/cd 这个可执行文件,因为改变工作目录必须由 Shell 自己完成(外部命令不能改变 Shell 进程的工作目录).

4.1 基础移动

$ cd /path/to/dir     # 绝对路径
$ cd dir # 相对路径(当前目录下的 dir)
$ cd ./dir # 同上,显式写 ./
$ cd ../sibling # 到上级的兄弟目录
$ cd ../../.. # 回退三级

4.2 快捷方式

$ cd                  # 不带参数 = 回家($HOME)
$ cd - # 回到上一个目录(利用 $OLDPWD)
$ cd -P /tmp/link # 进入物理路径,不跟随符号链接

CDPATH: cd 的 PATH

就像 PATH 让在任意位置执行命令,CDPATH 让从任意位置 cd 到常用目录:

$ export CDPATH="~/note:~/projects"
$ cd mine # 如果当前目录没有 mine/,Shell 去 ~/note/ 下找
# → cd ~/note/mine

但不建议过度使用--它会让对当前目录的依赖变得模糊.

4.3 zsh 的 AUTO_CD

zsh 有个便利选项: 输入目录路径本身就能 cd 进去,不需要打 cd:

# zsh 中默认开启
$ setopt AUTO_CD # 确保开启
$ /tmp # 直接敲路径 = cd /tmp
$ .. # = cd ..
$ ~ # = cd ~

5. ls: 查看目录内容

ls(List)是用得最多的命令. 它不仅列出文件名,还能显示权限, 大小, 修改时间等元信息.

5.1 基础用法

$ ls                  # 当前目录
$ ls /usr/local # 指定目录
$ ls -1 *.html # 通配符:所有 .html 文件,每行一个
$ ls file1 file2 # 列出多个指定文件(直接打印名字如果存在)

5.2 ls -l: 长格式(最常用的组合)

$ ls -l
-rw-r--r-- 1 yutong staff 18844 Jun 10 10:21 00-学习大纲与计划.html
drwxr-xr-x 2 yutong staff 64 Jun 11 09:30 terminal/

每一列的含义:

-rw-r--r--  1  yutong  staff  18844  Jun 10 10:21  00-学习大纲与计划.html
└─权限──┘ └链接数┘ └所有者┘ └组┘ └大小┘ └─修改时间──┘ └──文件名──┘

权限字段的第一个字符告诉文件类型:

字符 类型
- 普通文件
d 目录(directory)
l 符号链接(symlink)
p 命名管道(pipe/FIFO)
s 套接字(socket)
b 块设备(block device,如硬盘)
c 字符设备(character device,如终端)

5.3 最常用的 flag 组合

flag 含义 记忆
-l 长格式(long) long
-a 显示所有文件,包括隐藏的(all) all
-h 人类可读的大小(human-readable) human
-t 按修改时间排序(time),最新的在前 time
-r 反转排序结果(reverse) reverse
-S 按文件大小排序(Size),最大的在前 Size
-R 递归列出子目录(Recursive) Recursive
-d 只显示目录本身,不展开内容 directory
-1 每行一个文件(数字 1) one per line
# 日常最常用的组合
$ ls -la # 长格式 + 显示隐藏文件
$ ls -lh # 长格式 + 人类可读大小(1K, 234M, 2G)
$ ls -ltr # 长格式 + 按时间 + 反转 = 最新的在最后
$ ls -lSh # 长格式 + 按大小 + 人类可读 = 找出大文件
$ ls -ld */ # 只看目录本身,不看目录内容(*/匹配所有目录)

5.4 排序与过滤

# 按修改时间排序,最新的在前
$ ls -lt

# 按时间排序,但最新的在最后(方便看最近改了什么)
$ ls -ltr

# 按大小排序,最大的在前(找出谁占空间)
$ ls -lhS

# 只看目录
$ ls -d */
$ ls -ld */ # 带详细信息

# 只看隐藏文件
$ ls -ld .*

5.5 递归与通配

# 递归列出所有子目录(慎用--输出可能非常多)
$ ls -R

# zsh 通配符:递归匹配所有 .html 文件
$ ls **/*.html

# 列出所有子目录中的 .html 文件,带长格式
$ ls -lh **/*.html

6. tree: 可视化目录结构

tree 不是系统自带命令(需要 brew install tree),但它非常直观--用 ASCII 画出一棵目录树.

$ tree -L 2              # 只显示两级深度
$ tree -d # 只显示目录,不显示文件
$ tree -a # 包括隐藏文件
$ tree -L 2 -d ~/note # 家目录下 note 的目录结构,两级

如果没装 tree,可以用 ls -Rfind 替代:

$ ls -R | grep ":$" | sed 's/:$//'   # 只列出目录结构(不优雅但能用)
$ find . -maxdepth 2 -type d # 更干净的替代方案

快速回顾

  • Linux 文件系统单根树--所有东西挂在 / 下,没有盘符
  • pwd = 我在哪; cd = 移动(不带参数 = 回家)
  • 绝对路径/ 起,相对路径从当前位置起; .=当前 ..=上级 ~=家 -=上次
  • ls -l 显示权限/所有者/大小/时间; ls -a 显示隐藏文件; ls -lh 人类可读大小
  • 权限第一个字符 = 文件类型: - 普通 d 目录 l 符号链接
  • ls -ltr 最新在最下; ls -lhS 最大在最前; *ls -ld / 只看目录
  • tree -L 2 可视化目录树; zsh 的 **/*.html 递归通配

动手练习

  1. 基础导航: 运行 pwd,然后 cd /pwd,然后 cd - 回去
  2. 查看根目录: 在根目录 / 运行 ls -l,观察系统有哪些顶级目录
  3. 按时间排序: 在项目目录运行 ls -ltr--找到最近修改的文件
  4. 查看隐藏文件: 运行 ls -la ~--看到多少隐藏文件? 找到 .zshrc
  5. 按大小排序: 运行 ls -lhS ~/Downloads(如果有的话)--找出下载目录里最大的文件
  6. 目录树移动: 用 cd ..cd ../.. 练习在目录树中上下移动,每次用 pwd 确认位置