Linux基础指令(一):命令行入门
Linux基础指令(一):命令行入门
本文是 Linux 基础指令系列的第一篇,从零开始建立命令行操作的完整知识框架。后续还有(二)系统认知与效率和(三)权限系统详解。
每一行命令的执行,都是对确定性的一次祈祷。
为什么需要学 Linux 命令行
学过 C 语言的读者,大概率在 Windows 的 IDE 里写完代码,点一下运行按钮就完事了。编译器在哪?链接器做了什么?可执行文件到底放在了哪里?这些问题被图形界面温柔地藏了起来。
Linux 不藏。它把一切摊开给你看——前提是你得学会和它对话。而对话的唯一语言,就是命令行。
对于接下来要学 Linux 系统编程的读者来说,命令行不是选修课,是入场券。你将通过 shell 编译代码、调试程序、管理系统资源、理解文件 I/O 的底层行为。没有图形界面可以依赖——工作中也没有。
💡 背景补充:C 语言的标准库函数(
fopen、fread等)在 Linux 上直接调用系统调用(open、read),理解命令行的文件操作能帮你建立对文件系统的直觉,后续学系统 I/O 时会有豁然开朗的感觉。
Linux 背景速览
UNIX 与 Linux 的发展
1969 年,贝尔实验室的 Ken Thompson 和 Dennis Ritchie 在 Multics 的基础上开发了 UNIX。此后 UNIX 分化出两个主要分支:AT&T 的 System V 和伯克利的 BSD。
1991 年,赫尔辛基大学的研究生 Linus Torvalds 在 Usenet 上宣布他写了一个"类似 UNIX 的小操作系统"——这就是 Linux 的起点。0.02 版只能运行 bash 和 gcc,但全世界的程序员开始加入开发。1994 年,1.0 版本正式发布。
开源的力量
Linux 遵循GNU 通用公共许可证(GPL),任何基于 GPL 代码开发的衍生品在发布时都必须开源。这意味着 Linux 不属于任何一家公司——它属于所有人。
企业应用现状
Linux 的统治地位在不同领域表现各异:
| 领域 | 市场份额 | 说明 |
|---|---|---|
| 服务器 | ~75% | 政府、金融、电信等关键领域的主流选择 |
| 移动设备 | ~85%(Android 基于 Linux 内核) | 全球最流行的智能手机操作系统 |
| 云计算/大数据 | ~86% 的企业使用 Linux 构建 | 已取代 Unix 成为云平台核心 |
| 桌面 | 较小 | 与 Windows 在易用性和软件生态上仍有差距 |
主流发行版
Linux 是内核,发行版(Distribution)是内核 + 用户空间工具的完整操作系统。常见的有:
- Ubuntu:对新手最友好,社区活跃
- Debian:以稳定著称,适合服务器
- CentOS:红帽企业级 Linux 的免费重构版,使用 YUM 管理软件包
- Kali Linux:面向渗透测试,集成了大量安全工具
环境准备:远程连接 Linux
生产中几乎没有机会接触 Linux 的图形桌面。我们通过XShell(一个远程终端软件)连接到 Linux 服务器。
# 查看本机 IPifconfig# 通过 SSH 远程登录ssh[IP地址]XShell 下的复制粘贴快捷键:
| 操作 | 快捷键 |
|---|---|
| 复制 | Ctrl + Insert |
| 粘贴 | Shift + Insert |
注意:
Ctrl+C和Ctrl+V在 Linux 终端里不管用。Ctrl+C是用来终止程序的——别搞混了。
练习环境:WSL2
如果你用的是 Windows,不需要装虚拟机,也不需要租云服务器。WSL2(Windows Subsystem for Linux 2)是微软官方提供的 Linux 子系统,直接在 Windows 上运行完整的 Linux 内核。
WSL2 的优势:启动快、与 Windows 文件系统互通、资源占用低。几乎是在 Windows 上练习 Linux 的最佳选择。
具体安装步骤请自行搜索"WSL2 安装教程"——微软官方文档写得足够清晰,这里不赘述。
深入理解:Linux 的数据结构
在接触更多命令之前,先停下来看一个根本问题:Linux 是如何组织文件的?这不是可有可无的背景知识——理解了数据结构,你对路径、权限、硬链接这些概念会有本质的理解。
目录树:不只是"树"
前面说过文件系统是一棵目录树。但"目录"本身是什么?目录也是一个文件——一个存储了文件名到 inode 编号映射的特殊文件。
也就是说,目录的内容就是一个映射表:
文件名 → inode 编号 file.txt → 1844719 mydir/ → 1844720inode:文件的身份证
inode(Index Node,索引节点)是 Linux 文件系统的核心数据结构。一个文件的所有元数据都存在 inode 里:
| 存在 inode 中 | 不存在 inode 中 |
|---|---|
| 文件类型(普通文件/目录/链接…) | 文件名 |
| 权限(rwx) | 文件内容本身 |
| 所有者、所属组 | |
| 文件大小 | |
| 三个时间戳(ACM) | |
| 指向数据块的指针 |
关键结论:文件名不属于文件的固有属性,它只是目录里的一行记录。这就是为什么同一个 inode 可以有多个文件名(硬链接),也是为什么mv重命名在同一个文件系统内几乎是瞬时操作——它只改了目录文件里的一条映射,不碰文件的 inode,更不碰文件的实际数据。
文件 = 属性 + 内容
从这个角度看,Linux 上的每个文件由两部分组成:
文件 ├── 属性(元数据) → 存在 inode 中:权限、时间、大小、所有者... └── 内容(数据) → 存在数据块中,由 inode 中的指针定位stat命令读的是 inode 中的属性,cat命令顺着 inode 指针去读数据块。两者访问的是完全不同层次的存储。
路径与目录导航
文件系统的树状结构
Linux 将磁盘上的所有文件和目录组织成一棵目录树,根节点是/。普通文件一定是叶子节点;目录可能是叶子(空目录),也可能是分支节点。
理解路径的核心意义在于:树状结构的每一层都是唯一的定位方案。从根目录到任意文件的路径有且仅有一条。
- 绝对路径:从
/开始,不随当前位置变化。例如/home/whb/test/file.txt。配置文件中最常用。 - 相对路径:相对于当前工作目录定位。例如
../temp/。命令行中最常用。
pwd(print working directory)— 我在哪
# 显示当前工作目录pwd# 输出: /home/whb/test功能最简单的命令,没有选项,但可能是你最常敲的命令之一。
cd(change directory)— 去哪
cd[目录名]改变当前工作目录。几个高频用法:
cd..# 返回上级目录cd~# 快速回到家目录(/home/用户名)cd/# 进入根目录cd-# 返回最近一次访问的目录(反复按可以来回切换)cd/home/whb# 使用绝对路径跳转cd../temp# 使用相对路径跳转cd -是一个容易被忽视的效率工具——它记住的是你上一次所在的位置,反复使用可以在两个目录间来回切换。
ls(list)— 目录里有什么
ls[选项][目录或文件]列出目录下的所有子目录和文件。
常用选项组合:
| 选项 | 作用 |
|---|---|
-a | 列出所有文件,包括.开头的隐藏文件 |
-l | 列出详细信息(权限、大小、时间等) |
-t | 按修改时间排序 |
-r | 反向排序 |
-R | 递归列出所有子目录 |
-F | 文件名后加类型标记(/目录,*可执行,@符号链接) |
-i | 显示文件的 inode 编号 |
-1 | 一行只输出一个文件 |
实战示例:
# 查看当前目录下所有文件(包括隐藏文件)的详细信息ls-a-l# 按时间排序,最近修改的排在最后ls-lt# 递归查看所有子目录,带类型标记ls-lRFls -l输出的每一列都有意义:
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir从左到右依次是:文件类型与权限、硬链接数、所有者、所属组、文件大小(字节)、最后修改时间、文件名。
文件操作
touch(change file timestamps)— 创建文件(不止创建)
touch[选项]文件...最常用的场景是创建一个空的普通文件:
touchnewFile.txt# 创建 newFile.txt但它真正的作用是更改文件的时间戳。Linux 为每个文件维护了三个时间:
| 时间 | 含义 | 变更条件 |
|---|---|---|
| Access Time(atime) | 最后访问时间 | 读取文件内容时更新 |
| Modify Time(mtime) | 最后修改时间 | 文件内容被修改时更新 |
| Change Time(ctime) | 最后状态变更时间 | 元数据(权限、所有者等)改变时更新 |
# 只更新 access timetouch-anewFile.txt# 只更新 modify timetouch-mnewFile.txt# 查看文件的详细时间信息statnewFile.txt注意:修改 access time 会导致 change time 也更新——因为 atime 本身属于文件的元数据。
mkdir(make directories)— 创建目录
mkdir[选项]目录名...-p是必记选项:递归创建路径中所有不存在的目录。
# 一次创建多层嵌套目录mkdir-ppath1/path2/path3/path4不用-p的话,如果path1不存在,创建会直接失败。-p让系统自动建好缺失的每一层——这在写脚本时尤其有用。
rmdir(remove directory)与rm(remove)— 删除
rmdir只删空目录:
rmdirmydir# 删除空目录rmdir-ppath1/path2/path3/path4# 递归删除空目录链rm是真正的通用删除工具:
rmfile.txt# 删除普通文件rm-rdir# 递归删除目录及其所有内容rm-rfpath# 强制递归删除(不询问,不报错)rm-ifile.txt# 删除前逐一确认⚠️
rm -rf是 Linux 世界里最危险的命令之一。没有回收站,没有"撤销"。执行之前确认一遍路径——失控的删除比任何 bug 都更不可逆。
cp(copy)— 复制
cp[选项]源文件 目标文件cp[选项]源文件... 目标目录核心选项:-r(递归复制目录)、-f(强制覆盖)、-i(覆盖前询问)。
# 复制文件并重命名cpmyfile.txt myfile-backup.txt# 将多个 .txt 文件复制到 dir 目录cp*.txt dir/# 递归复制整个目录cp-rftesttest-backup第二个参数的类型决定了cp的行为:
- 如果目标是一个不存在的路径,则复制并重命名
- 如果目标是一个已存在的目录,则将源文件复制到该目录内
mv(move)— 移动与重命名
mv[选项]源 目标mv在 Linux 里身兼两职——重命名和移动是同一个操作。区别仅在于第二个参数:
- 第二个参数是不存在的文件名→ 重命名
- 第二个参数是已存在的目录→ 移动到该目录下
mvmyfile.txt yourfile.txt# 重命名mvmyfile.txt temp/# 移动到 temp 目录mv-iold.txt new.txt# 如果 new.txt 已存在,询问是否覆盖查看文件内容
Linux 提供了从"一股脑输出"到"精细翻页"的多层次查看工具。
cat(concatenate)— 一次输出全部
cat[选项][文件]适合短文件。三个常用选项:
| 选项 | 效果 |
|---|---|
-n | 对所有行编号(含空行) |
-b | 仅对非空行编号 |
-s | 将连续多行空行压缩为一行 |
cat-ntemp.txt# 带行号输出cat-btemp.txt# 只给有内容的行编号cat-stemp.txt# 不显示连续空行more(file perusal filter)与less(opposite of more)— 分页查看
more只能向下翻页,less可以上下自由翻页。几乎所有场景都应该优先用less。
less-Ntemp.txt# -N 显示行号在less中:
| 操作 | 按键 |
|---|---|
| 向下搜索 | /搜索词 |
| 向上搜索 | ?搜索词 |
| 下一个匹配 | n |
| 上一个匹配 | N |
| 退出 | q |
less在打开文件时不会一次性加载全部内容——对于上百 MB 的日志文件,这是巨大的性能优势。
head(output first part)与tail(output last part)— 只看头尾
head-n10temp.txt# 显示前 10 行(默认就是 10 行)tail-n5temp.txt# 显示最后 5 行tail-flog.txt# 持续监控文件末尾的新增内容(查看日志的标配操作)tail -f是服务器排查问题的第一板斧——它会一直等待并输出文件新增的行,按Ctrl+C退出。
管道组合的经典用法:取文件的某一段内容。
# 显示文件的第 180 到 200 行head-200temp.txt|tail-20|是管道符,把前一个命令的输出作为后一个命令的输入。head -200取前 200 行,交给tail -20取最后 20 行——两者组合就得到了 [180, 200] 这个区间。
搜索与查找
grep(globally search a regular expression and print)— 文本搜索
grep[选项]搜索字符串 文件在文件中搜索包含指定字符串的行。这是 Linux 命令行使用频率最高的命令之一。
grep"hello"temp.txt# 搜索包含 hello 的行grep-i"hello"temp.txt# 忽略大小写grep-n"hello"temp.txt# 顺带输出行号grep-v"hello"temp.txt# 反向选择:输出不含 hello 的行grep-ni"hello"temp.txt# 组合使用:忽略大小写 + 带行号grep-r"main"./src/# 递归搜索整个目录find(search for files)— 文件查找
find路径-name文件名模式find直接在磁盘上搜索文件,功能极其强大但选项复杂。入门先记住最常用的-name:
# 在家目录下搜索名为 test.c 的文件find~-nametest.c# 在当前目录下搜索所有 .cpp 文件find.-name"*.cpp"⚠️ 在大文件系统上跑
find可能很慢。如果搜索范围超过几十 GB,考虑放到后台执行。
which(locate a command)与whereis(locate binary/source/manual)— 定位命令
whichls# 显示 ls 命令的可执行文件路径# 输出: /usr/bin/lswhereisls# 显示命令的二进制文件、源码和手册页位置# 输出: ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz本节要点
- Linux 文件系统是一棵树,绝对路径从
/开始,相对路径从当前位置开始,两者各有适用场景 ls -l+cd+pwd是导航三件套,cd -能让你在两个目录间高效切换rm -rf没有回收站,执行之前确认路径——Boss 不接受"不小心删了"less比more好用,支持上下翻页和双向搜索,大文件不卡顿- 管道
|是命令行的编程接口,head -200 temp.txt | tail -20这种组合值得内化 - 文件名不是文件的固有属性,它只是目录里的一条映射。
mv重命名的极快速度正源于此 - inode 是文件的身份证,存储了权限、时间、所有者等所有元数据——文件名不在其中
- 文件 = 属性 + 内容,
stat读 inode,cat读数据块,两者访问的是不同层次 - 每个文件维护三个时间戳:atime(访问)、mtime(修改)、ctime(状态变更)
- 不要背选项,知道命令叫什么就够了。当场
man或--help,把记忆力留给理解"为什么这样设计"
