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.txt 和 note.txt 是两个不同的文件
2. pwd: 我在哪?
pwd(Print Working Directory)是最简单的命令--打印当前工作目录的绝对路径. 在目录树中的 "当前位置" 就是工作目录.
$ pwd /Users/yutong/note/mine
$ cd /tmp $ pwd /tmp
|
注意: pwd 有两个变体--Shell 内置的 pwd 和 /bin/pwd. 在涉及符号链接(symlink)时行为不同:
$ cd /tmp/link $ pwd /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 $ cat 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 $ cd ./dir $ cd ../sibling $ cd ../../..
|
4.2 快捷方式
$ cd $ cd - $ cd -P /tmp/link
|
CDPATH: cd 的 PATH
就像 PATH 让在任意位置执行命令,CDPATH 让从任意位置 cd 到常用目录:
$ export CDPATH="~/note:~/projects" $ cd mine
|
但不建议过度使用--它会让对当前目录的依赖变得模糊.
4.3 zsh 的 AUTO_CD
zsh 有个便利选项: 输入目录路径本身就能 cd 进去,不需要打 cd:
$ setopt AUTO_CD $ /tmp $ .. $ ~
|
5. ls: 查看目录内容
ls(List)是用得最多的命令. 它不仅列出文件名,还能显示权限, 大小, 修改时间等元信息.
5.1 基础用法
$ ls $ ls /usr/local $ ls -1 *.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 $ ls -ltr $ ls -lSh $ ls -ld */
|
5.4 排序与过滤
$ ls -lt
$ ls -ltr
$ ls -lhS
$ ls -d */ $ ls -ld */
$ ls -ld .*
|
5.5 递归与通配
$ ls -R
$ ls **/*.html
$ ls -lh **/*.html
|
6. tree: 可视化目录结构
tree 不是系统自带命令(需要 brew install tree),但它非常直观--用 ASCII 画出一棵目录树.
$ tree -L 2 $ tree -d $ tree -a $ tree -L 2 -d ~/note
|
如果没装 tree,可以用 ls -R 或 find 替代:
$ 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 递归通配
动手练习
- 基础导航: 运行
pwd,然后 cd / 再 pwd,然后 cd - 回去
- 查看根目录: 在根目录
/ 运行 ls -l,观察系统有哪些顶级目录
- 按时间排序: 在项目目录运行
ls -ltr--找到最近修改的文件
- 查看隐藏文件: 运行
ls -la ~--看到多少隐藏文件? 找到 .zshrc
- 按大小排序: 运行
ls -lhS ~/Downloads(如果有的话)--找出下载目录里最大的文件
- 目录树移动: 用
cd .. 和 cd ../.. 练习在目录树中上下移动,每次用 pwd 确认位置