文件和目录操作
ls vs dir
这两个命令都是用来列出目录内容的,但 ls 是 POSIX 标准,而 dir 是 GNU 扩展,通常只在 GNU/Linux 系统上可用(作为 coreutils 包的一部分)。

| 特性 | ls |
dir |
|---|---|---|
| 所属 | POSIX 标准,几乎所有 Unix-like 系统都有 | GNU 扩展,主要用于 Linux |
| 默认行为 | 以单列形式列出文件名 | 以多列、彩色、带文件类型后缀的形式列出 |
| 常用选项 | -l (长格式), -a (隐藏文件), -h (人类可读) |
无需选项即可获得丰富的输出 |
| 适用场景 | 通用首选,在所有系统上行为一致,脚本编写首选。 | 快速浏览,在交互式 shell 中,dir 提供了更友好的默认视图。 |
ls 是行业标准,dir 是 ls 的一个“美化”版本。建议始终使用 ls,因为它更具可移植性。
cp vs mv
这两个命令都用于处理文件,但核心功能完全不同。
| 特性 | cp (copy) |
mv (move) |
|---|---|---|
| 核心功能 | 复制:创建源文件的一个或多个副本。 | 移动/重命名:将文件或目录从一个位置移动到另一个位置,或在同一位置内重命名。 |
| 对源文件的影响 | 源文件保持不变。 | 源文件在原位置消失(除非移动到同一设备的不同路径,此时是“重命名”)。 |
| 常用选项 | -r/-R (递归复制目录), -p (保留权限/时间戳), -i (交互式) |
-i (交互式), -f (强制), -u (仅当源比目标新时才移动) |
| 适用场景 | 备份文件、将文件复制到其他目录、将目录结构复制到新位置。 | 整理文件、将文件移动到不同文件夹、重命名文件或目录。 |
cp 是“克隆”,mv 是“搬家/改名”,操作前务必分清,mv 操作是不可逆的(除非有备份)。
rm vs rmdir
这两个命令都用于删除,但删除的对象不同。

| 特性 | rm (remove) |
rmdir (remove directory) |
|---|---|---|
| 功能 | 删除文件或目录(需要 -r 选项)。 |
仅删除空目录。 |
| 删除目录 | 需要 -r (递归) 或 -R 选项。 |
不能删除非空目录。 |
| 安全性 | 非常危险,尤其是 rm -rf。 |
相对安全,因为它只删除空目录,不会误删文件。 |
| 适用场景 | 删除文件、删除整个目录树(无论是否为空)。 | 清理那些已经清空内容的目录。 |
rmdir 是一个“安全”但功能有限的命令,99% 的情况下你会使用 rm 来删除文件,使用 rm -r 或更安全的 rm -ri 来删除目录。
ln (硬链接 vs 软链接)
ln 命令用于创建链接,这是理解 Linux 文件系统的核心。
| 特性 | 硬链接 | 软链接 / 符号链接 |
|---|---|---|
| 本质 | 多个文件名指向同一个 inode。 | 一个独立的文件指向另一个文件的路径。 |
| inode | 共享同一个 inode。 | 拥有自己独立的 inode。 |
| 与文件关系 | 必须在同一个文件系统内创建。 | 可以跨任意文件系统创建。 |
| 对源文件 | 如果删除源文件,硬链接仍然可用。 | 如果删除源文件,软链接失效(变成“dangling link”)。 |
| 大小 | 大小与源文件相同,记录的是文件数据块。 | 大小很小,只记录目标文件的路径字符串。 |
| 适用场景 | 不常用,主要用于数据库等需要多个入口的场景。 | 极其常用,用于创建快捷方式、管理程序/库版本、组织文件。 |
创建命令:
- 硬链接:
ln source_file hardlink_name - 软链接:
ln -s source_file softlink_name
软链接是你在日常工作中几乎唯一会用到的链接方式,它更灵活、更安全,就像 Windows 的快捷方式。

查看和处理
cat vs less vs more
这三个命令都用于查看文件内容,但交互方式和目的不同。
| 特性 | cat (concatenate) |
more |
less |
|---|---|---|---|
| 核心功能 | 一次性显示整个文件内容到终端。 | 分页显示,只能向前翻页。 | 分页显示,可以自由前后翻页、搜索。 |
| 交互性 | 无,输出后立即返回命令行。 | 有限,只能按空格/回车向下,按 q 退出。 |
高度交互,支持上下箭头、 搜索、 反向搜索等 vi 的按键。 |
| 适用场景 | 查看短文件内容、将内容重定向到其他命令或文件、快速确认文件末尾几行 (tail -n 10 file \| cat)。 |
在古老的系统上查看长文件,less 是其现代替代品。 |
查看长文件的首选,功能强大,是 Linux 用户必备的技能。 |
cat 用于“流式”处理,less 用于“交互式”阅读。99% 的情况下,用 less 查看文件,用 cat 处理文件。
grep vs egrep vs fgrep
这三个命令都是强大的文本搜索工具,主要区别在于正则表达式的支持。
| 特性 | grep (Global Regular Expression Print) |
egrep (Extended grep) |
fgrep (Fixed grep) |
|---|---|---|---|
| 正则表达式 | 支持基本正则表达式。 | 支持扩展正则表达式(, , , 等)。 | 不支持正则表达式,将所有字符视为普通字面量。 |
| 性能 | 标准性能。 | 通常比 grep -E 稍快一点点,但现代 grep 已经优化。 |
最快,因为它不需要解析复杂的正则语法。 |
| 现代用法 | grep -E |
已过时,直接使用 grep -E 即可。 |
已过时,直接使用 grep -F 即可。 |
| 适用场景 | 日常文本搜索。 | 需要使用扩展正则表达式时(匹配 "color" 或 "colour")。 | 搜索包含大量特殊字符的固定字符串,或当速度至关重要时。 |
egrep 和 fgrep 是历史遗留命令,现代 Linux 中,直接使用 grep -E 和 grep -F 是更规范的做法。
sed vs awk
这两个都是流编辑器,用于对文本进行复杂的转换和提取,但设计哲学和适用场景不同。
| 特性 | sed (Stream Editor) |
awk (Aho, Weinberger, Kernighan) |
|---|---|---|
| 设计哲学 | 面向“行”的编辑器,逐行处理,执行指定的编辑命令(如替换、删除、插入)。 | 面向“列”的报告生成器,逐行处理,但默认按字段(列)来处理和格式化输出。 |
| 处理单位 | 整行。 | 默认按空白字符(空格、制表符)分割为字段($1, $2, ...),$0 代表整行。 |
| 主要用途 | 文本替换 (s/old/new/g)、删除行 (d)、插入/追加行 (i, a)。 |
提取列 (print $1, $3)、基于复杂条件进行格式化输出、简单计算。 |
| 编程能力 | 有简单的控制流(n, b, t 等),但较弱。 |
一门完整的脚本语言,支持变量、循环、函数、条件判断。 |
| 适用场景 | 快速、简单的行内修改,如批量替换文件中的字符串。 | 从结构化文本(如 ps aux, df -h, /etc/passwd)中提取和格式化数据。 |
sed 是“外科手术刀”,适合对单行或整块文本做精确修改。awk 是“数据分析师”,擅长从表格式的数据中提取信息并生成报表。
系统信息和进程管理
ps vs top vs htop
这三个命令都用于查看进程信息,但实时性和交互性不同。
| 特性 | ps (Process Status) |
top |
htop |
|---|---|---|---|
| 输出方式 | 快照,运行一次,输出一个当前进程的静态列表。 | 实时,持续刷新,动态显示进程状态。 | 实时,持续刷新,界面更美观、信息更丰富。 |
| 交互性 | 无,通过命令行选项控制输出。 | 有限,可以排序、杀死进程,但按键操作较原始。 | 高度交互,使用类似 vi/nano 的按键,鼠标支持,彩色显示,树状视图。 |
| 常用选项 | aux (查看所有用户进程), ef (显示进程树), u (按用户显示) |
默认持续运行,按 q 退出。 |
默认持续运行,按 F1 查看帮助,按 q 退出。 |
| 适用场景 | 脚本中获取特定进程的信息、一次性查看系统进程状态。 | 在没有 htop 的系统上监控资源使用情况。 |
日常监控系统的首选,直观、易用、功能强大。 |
ps 用于“取证”,top 用于“基本监控”,htop 用于“高级监控”。如果你的系统安装了 htop,就别再用 top 了。
网络工具
ping vs traceroute/tracepath
这两个命令都与网络路径有关,但目的不同。
| 特性 | ping |
traceroute / tracepath |
|---|---|---|
| 核心功能 | 测试网络连通性,向目标主机发送 ICMP 回显请求,并等待响应。 | 追踪网络路由路径,显示数据包从源到目标所经过的所有路由器(跳)。 |
| 输出信息 | 往返时间、丢包率。 | 每一跳的 IP 地址、主机名(如果解析)和往返时间。 |
| 工作原理 | 发送包到最终目标,由目标直接响应。 | 发送一系列包,并利用 IP 包的“TTL”(Time To Live)逐跳“逼退”路由器,让其返回错误信息。 |
| 适用场景 | 快速判断一个网站或服务器是否“活着” (ping google.com)。 |
网络故障排查,定位数据包在哪一跳丢失或延迟过高。 |
ping 回答“能通吗?”,traceroute 回答“走的哪条路?”。
搜索命令
find vs locate
这两个命令都用于在文件系统中查找文件,但原理和性能差异巨大。
| 特性 | find |
locate |
|---|---|---|
| 工作原理 | 实时搜索,从指定的目录开始,递归遍历整个文件系统,根据条件匹配文件。 | 基于数据库搜索,查询一个预先建立的文件名数据库 (/var/lib/mlocate/mlocate.db)。 |
| 速度 | 慢,尤其是在大文件系统上。 | 极快,因为它只是在数据库中查询字符串。 |
| 数据实时性 | 实时、准确,总能找到当前系统中存在的文件。 | 可能过时,数据库通常是每天更新一次,所以可能找不到刚创建的文件。 |
| 灵活性 | 极高,可以按文件名、大小、类型、权限、修改时间、所有者等任何条件查找。 | 较低,只能按文件名(通配符)查找。 |
| 适用场景 | 需要根据复杂条件查找文件、需要确保结果是最新的。 | 快速查找一个记得名字的文件,不关心文件是否刚刚被创建。 |
find 是“地毯式搜索”,功能强大但慢。locate 是“查字典”,飞快但可能信息不全。先用 locate 快速查找,找不到再用 find。
总结与学习建议
| 对比组 | 主要区别 | 何时用哪个? |
|---|---|---|
| 列表 | 功能丰富度 vs 通用性 | ls (首选), dir (可选) |
| 文件操作 | 复制 vs 移动/重命名 | cp (备份), mv (移动/改名) |
| 删除 | 删除任何东西 vs 只删除空目录 | rm (常用), rmdir (少用) |
| 链接 | 共享 inode vs 独立文件 | ln -s (软链接,首选) |
| 查看文件 | 一次性显示 vs 交互式分页 | cat (处理), less (阅读) |
| 文本搜索 | 基本正则 vs 扩展正则 vs 固定字符串 | grep (默认), grep -E (扩展), grep -F (固定) |
| 流编辑 | 行编辑 vs 列处理/报表生成 | sed (行修改), awk (列提取) |
| 进程监控 | 快照 vs 实时监控 | ps (脚本), htop (交互) |
| 网络诊断 | 测试连通性 vs 追踪路径 | ping (通不通), traceroute (在哪卡) |
| 文件搜索 | 实时遍历 vs 数据库查询 | locate (快), find (准/全) |
学习建议:
- 从核心命令开始: 先熟练掌握
cd,ls,pwd,cp,mv,rm,mkdir,touch,cat,less,grep,find。 - 理解而非死记: 不要只记住命令,要理解它们的设计哲学。
awk为什么擅长处理列?find为什么慢? - 多用
man页:man是你最好的老师,学会阅读man页中的SYNOPSIS(用法) 和DESCRIPTION(描述) 部分。 - 结合实践: 在你的 Linux 系统上多动手尝试,创建一些测试文件和目录,用不同的命令去操作它们,观察结果。
- 学习组合使用: 真正的威力在于管道 和重定向
>/>>。ps aux \| grep nginx就是一个非常经典的组合。
希望这份详细的对比能帮助你更好地理解和使用 Linux 命令!
