总结于 《鸟哥的 Linux 私房菜 - 基础学习篇》 ,图片也来自于此。
核心思想
目录树结构(directory tree)
Linux 系统是基于目录树结构的,这是它的核心思想。目录,即文件夹。Linux 系统相当于一个文件夹,Linux 系统的所有数据要么对应一个文件夹,要么就是一个文件。比如,你新建一个用户,其实就是新建了一个文件夹。一个用户对应一个文件夹。目录树结构:

上图中 长方形是文件夹, 波浪形是文件,根目录是 / 。这个 / 很巧妙,在 macOS 中,假设你下载文件 test.md 到 /Users/username/Desktop/,那么文件会下载到桌面,最前面这个 / 就是根目录。如果你写成 Users/username/Desktop/,那么文件就会下载到currentDerectory/Users/username/Desktop/下。
Linux 系统使用的是目录树架构,但其实数据是存放在 磁盘分区 当中的,那么问题来了:目录树和磁盘分区是神马关系?这个时候就牵扯到一个叫「挂载(mount)」的概念了。
目录树和磁盘分区的关系
挂载其实就是建立目录树和磁盘分区之间的关系。目录只是一个标识,叫什么我们可以自定义,一个磁盘分区对应一个目录。
我们经常用 U 盘,假设一个 U 盘是一个磁盘分区,我们把一个假设叫 partition1 的 U 盘插到 Windows 电脑上,可能电脑就多了个 F 盘,那么目录就是 F ,相当于将目录 F 挂载到了 U 盘上,访问 F 就可以访问 partition1 里的内容。如果再插一个假设叫 partition2 的 U 盘,系统应该就会多了一个 H 盘,相当于目录 H 就挂载到了 partition2 上。假设 F 盘下将会有一个存放很多视频的 moive 文件夹,我们可以直接将 movie 文件夹挂载到 partition2 上,这样 movie 里的视频就存到 partition2 里面了,就不占用 F 盘的空间了。
在 Linux 系统中道理也是一样的,比如在搭建 Linux 环境的时候,可以将 /home 单独挂载到一个磁盘分区上。

- 更多内容请看鸟哥 Linux 安装模式下,磁碟分割的选择
常用命令
| 命令 | 含义 | 选项 | 示例 |
|---|---|---|---|
--help |
ls --help |
||
| man | manual | man man |
|
| grep | file pattern searcher | -i, --ignore-case-c, --count |
grep "some string" <file>grep -i "some string" <file>grep -c "github" index.md // 7 |
| ls | list | -a, --all-h, --human-readable-l, --long listing format |
ls -ah:显示目录下所有文件夹,包括隐藏文件夹 ls -l == ll |
| cd | change directory | cd 相当于 cd ~,~ 当前用户根目录cd / 根目录cd .. 上一层cd ../.. 上两层cd ../<directory> 上一层里面某个目录cd <directory>/<directory> 当前目录下的某个目录下的某个目录 |
|
| rm | remove | -d, --direcorty-r, --recursive-f, --force |
rm <file>rm -d <directory>rm -rf <directory>rm *.pdf |
| rmdir | remove directory | rmdir <directroy> |
|
| cat | concatenate | cat <file> |
|
| mkdir | make direcotry | mkdir <directory> |
|
| touch | create a file | touch <file> |
|
| mv | move | mv oldname namemv <file>/<directory> <directory> |
|
| cp | copy | -R |
cp test test.bakcp -R <direction> <direction> |
| pwd | print working directory | pwd |
|
| echo | output | echo "some text" |
|
| find | find a file or derectory | find path -name filename/directoryfind . -name index.jsfind . -name LeetCode |
|
| zip | -r, --recurse |
zip -r test.zip test/ |
|
| unzip | unzip test.zip |
||
| tar | tape or archive | -f, --file=ARCHIVE-c, --create-t, --list-v, --verbose-x, --extract-z, --gzip, --gunzip, --ungzip |
tar -cf archive.tar foo bar:将文件 foo 和 bar 创建为 archive.tartar -tvf archive.tar: 详细列出 archive.tar 中所有文件tar -xf archive.tar:从 archive.tar 中提取所有文件tar xvzf redis-stable.tar.gz:从 redis-stable.tar.gz 中详细提取所有文件 |
| sh | run a script | sh test.sh 相当于 ./test.sh |
|
| start | start notepad++ <file>start Typora <file> |
||
| vi | visual | vi <file> |
|
| vim | vi improved | vim <file> |
control + w 删除输入字符
option + < 像左移动
vi/vim 的三种模式
vi <file> 和 vim <file> 都是修改 <file> 的命令,后者为前者的增强版,输入此命令后,会有三种模式修改 <file> 文件。
- 一般指令模式(command mode):你看不见你输入的内容
- 编辑模式(insert mode):直接修改文件内容
- 指令列命令模式(command-line mode):最下面一行,
:或/或?开头

- 以下指令详细含义请看 vim 程式编辑器
常用指令
- 一般指令模式:
| 指令 | 含义 |
|---|---|
| i | 当前位置进入 insert 模式 |
| I | 第一个字符 |
| a | 下一个字符 |
| A | 末尾 |
| o | 下一列开头 |
| O | 上一列开头 |
| r | Replace 模式,取代一次 |
| R | 一直取代 |
| u | 撤销 |
| Ctrl + r | 取消撤销,相当于 U? |
| 0 | 行首 |
| end / $ | 行尾 |
| G | 最后一列 |
| gg | 1 G,第一列 |
n<enter> |
向下移动 n 列 |
| Ctrl + f | fall,向下一页 |
| Ctrl + b | before,向上一页 |
| x | 删除 |
| X | 删除前一个 |
| dd | 删除当前列 |
| d$ | 删除从当前位置到列尾 |
| yy (yank) | 复制当前列 |
| p (paste) | 粘贴当前列 |
- 编辑模式:
| 指令 | 含义 |
|---|---|
| Esc | 退出编辑模式,进入一般指令模式 |
- 指令列命令模式:
| 指令 | 含义 |
|---|---|
| :w | 保存 |
| :w! | 强制保存 |
| :q | 退出 |
| :q! | 强制退出 |
| :wq | 退出并保存,相当于 ZZ |
| /word | 查找关键字 |
| :set nu | 显示行号 |
| :1,$s/word1/word2/gc | word1 替换为 word2 |
/word 查找时,可使用 n 跳转到下一个查找结果,N 跳转到上一个查找结果
脚本语法
- 遍历。示例:一个打印出当前路径下所有文件夹的目录的脚本,名叫
traverse.sh,内容如下:
|
执行脚本: sh traverse.sh
- 更多内容请看 学习 Shell Scripts
其他常用命令
## 用户 |
Bash VS Zsh
Bash,Unix shell 的一种,能运行于大多数 类Unix系统 的操作系统之上,包括 Linux 与 macOS 都将它作为默认shell。
是 Bourne shell 的后继兼容版本与开放源代码版本,它的名称来自 Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。
Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。
来自 Bash 维基百科
Z shell(Zsh)是一款可用作 [交互式](https://zh.wikipedia.org/w/index.php?title = 交互式 & action=edit&redlink=1) 登录的 [shell](https://zh.wikipedia.org/wiki/ 殼層) 及 [脚本编写](https://zh.wikipedia.org/wiki/Shell 脚本) 的 [命令解释器](https://zh.wikipedia.org/wiki/ 命令行界面)。Zsh 对 Bourne shell 做出了大量改进,同时加入了 Bash、ksh 及 tcsh 的某些功能。
来自 Z shell 维基百科
总结: Bash 是默认 shell,Zsh 是 Bash 的增强版。有的命令 Bash 和 Zsh 不通用,如 Bash 中的 start 命令在 Zsh 总