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 分化出两个主要分支ATT 的 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注意CtrlC和CtrlV在 Linux 终端里不管用。CtrlC是用来终止程序的——别搞混了。练习环境WSL2如果你用的是 Windows不需要装虚拟机也不需要租云服务器。WSL2Windows Subsystem for Linux 2是微软官方提供的 Linux 子系统直接在 Windows 上运行完整的 Linux 内核。WSL2 的优势启动快、与 Windows 文件系统互通、资源占用低。几乎是在 Windows 上练习 Linux 的最佳选择。具体安装步骤请自行搜索WSL2 安装教程——微软官方文档写得足够清晰这里不赘述。深入理解Linux 的数据结构在接触更多命令之前先停下来看一个根本问题Linux 是如何组织文件的这不是可有可无的背景知识——理解了数据结构你对路径、权限、硬链接这些概念会有本质的理解。目录树不只是树前面说过文件系统是一棵目录树。但目录本身是什么目录也是一个文件——一个存储了文件名到 inode 编号映射的特殊文件。也就是说目录的内容就是一个映射表文件名 → inode 编号 file.txt → 1844719 mydir/ → 1844720inode文件的身份证inodeIndex Node索引节点是 Linux 文件系统的核心数据结构。一个文件的所有元数据都存在 inode 里存在 inode 中不存在 inode 中文件类型普通文件/目录/链接…文件名权限rwx文件内容本身所有者、所属组文件大小三个时间戳ACM指向数据块的指针关键结论文件名不属于文件的固有属性它只是目录里的一行记录。这就是为什么同一个 inode 可以有多个文件名硬链接也是为什么mv重命名在同一个文件系统内几乎是瞬时操作——它只改了目录文件里的一条映射不碰文件的 inode更不碰文件的实际数据。文件 属性 内容从这个角度看Linux 上的每个文件由两部分组成文件 ├── 属性元数据 → 存在 inode 中权限、时间、大小、所有者... └── 内容数据 → 存在数据块中由 inode 中的指针定位stat命令读的是 inode 中的属性cat命令顺着 inode 指针去读数据块。两者访问的是完全不同层次的存储。路径与目录导航文件系统的树状结构Linux 将磁盘上的所有文件和目录组织成一棵目录树根节点是/。普通文件一定是叶子节点目录可能是叶子空目录也可能是分支节点。理解路径的核心意义在于树状结构的每一层都是唯一的定位方案。从根目录到任意文件的路径有且仅有一条。绝对路径从/开始不随当前位置变化。例如/home/whb/test/file.txt。配置文件中最常用。相对路径相对于当前工作目录定位。例如../temp/。命令行中最常用。pwdprint working directory— 我在哪# 显示当前工作目录pwd# 输出: /home/whb/test功能最简单的命令没有选项但可能是你最常敲的命令之一。cdchange directory— 去哪cd[目录名]改变当前工作目录。几个高频用法cd..# 返回上级目录cd~# 快速回到家目录/home/用户名cd/# 进入根目录cd-# 返回最近一次访问的目录反复按可以来回切换cd/home/whb# 使用绝对路径跳转cd../temp# 使用相对路径跳转cd -是一个容易被忽视的效率工具——它记住的是你上一次所在的位置反复使用可以在两个目录间来回切换。lslist— 目录里有什么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从左到右依次是文件类型与权限、硬链接数、所有者、所属组、文件大小字节、最后修改时间、文件名。文件操作touchchange file timestamps— 创建文件不止创建touch[选项]文件...最常用的场景是创建一个空的普通文件touchnewFile.txt# 创建 newFile.txt但它真正的作用是更改文件的时间戳。Linux 为每个文件维护了三个时间时间含义变更条件Access Timeatime最后访问时间读取文件内容时更新Modify Timemtime最后修改时间文件内容被修改时更新Change Timectime最后状态变更时间元数据权限、所有者等改变时更新# 只更新 access timetouch-anewFile.txt# 只更新 modify timetouch-mnewFile.txt# 查看文件的详细时间信息statnewFile.txt注意修改 access time 会导致 change time 也更新——因为 atime 本身属于文件的元数据。mkdirmake directories— 创建目录mkdir[选项]目录名...-p是必记选项递归创建路径中所有不存在的目录。# 一次创建多层嵌套目录mkdir-ppath1/path2/path3/path4不用-p的话如果path1不存在创建会直接失败。-p让系统自动建好缺失的每一层——这在写脚本时尤其有用。rmdirremove directory与rmremove— 删除rmdir只删空目录rmdirmydir# 删除空目录rmdir-ppath1/path2/path3/path4# 递归删除空目录链rm是真正的通用删除工具rmfile.txt# 删除普通文件rm-rdir# 递归删除目录及其所有内容rm-rfpath# 强制递归删除不询问不报错rm-ifile.txt# 删除前逐一确认⚠️rm -rf是 Linux 世界里最危险的命令之一。没有回收站没有撤销。执行之前确认一遍路径——失控的删除比任何 bug 都更不可逆。cpcopy— 复制cp[选项]源文件 目标文件cp[选项]源文件... 目标目录核心选项-r递归复制目录、-f强制覆盖、-i覆盖前询问。# 复制文件并重命名cpmyfile.txt myfile-backup.txt# 将多个 .txt 文件复制到 dir 目录cp*.txt dir/# 递归复制整个目录cp-rftesttest-backup第二个参数的类型决定了cp的行为如果目标是一个不存在的路径则复制并重命名如果目标是一个已存在的目录则将源文件复制到该目录内mvmove— 移动与重命名mv[选项]源 目标mv在 Linux 里身兼两职——重命名和移动是同一个操作。区别仅在于第二个参数第二个参数是不存在的文件名→ 重命名第二个参数是已存在的目录→ 移动到该目录下mvmyfile.txt yourfile.txt# 重命名mvmyfile.txt temp/# 移动到 temp 目录mv-iold.txt new.txt# 如果 new.txt 已存在询问是否覆盖查看文件内容Linux 提供了从一股脑输出到精细翻页的多层次查看工具。catconcatenate— 一次输出全部cat[选项][文件]适合短文件。三个常用选项选项效果-n对所有行编号含空行-b仅对非空行编号-s将连续多行空行压缩为一行cat-ntemp.txt# 带行号输出cat-btemp.txt# 只给有内容的行编号cat-stemp.txt# 不显示连续空行morefile perusal filter与lessopposite of more— 分页查看more只能向下翻页less可以上下自由翻页。几乎所有场景都应该优先用less。less-Ntemp.txt# -N 显示行号在less中操作按键向下搜索/搜索词向上搜索?搜索词下一个匹配n上一个匹配N退出qless在打开文件时不会一次性加载全部内容——对于上百 MB 的日志文件这是巨大的性能优势。headoutput first part与tailoutput last part— 只看头尾head-n10temp.txt# 显示前 10 行默认就是 10 行tail-n5temp.txt# 显示最后 5 行tail-flog.txt# 持续监控文件末尾的新增内容查看日志的标配操作tail -f是服务器排查问题的第一板斧——它会一直等待并输出文件新增的行按CtrlC退出。管道组合的经典用法取文件的某一段内容。# 显示文件的第 180 到 200 行head-200temp.txt|tail-20|是管道符把前一个命令的输出作为后一个命令的输入。head -200取前 200 行交给tail -20取最后 20 行——两者组合就得到了 [180, 200] 这个区间。搜索与查找grepglobally search a regular expression and print— 文本搜索grep[选项]搜索字符串 文件在文件中搜索包含指定字符串的行。这是 Linux 命令行使用频率最高的命令之一。grephellotemp.txt# 搜索包含 hello 的行grep-ihellotemp.txt# 忽略大小写grep-nhellotemp.txt# 顺带输出行号grep-vhellotemp.txt# 反向选择输出不含 hello 的行grep-nihellotemp.txt# 组合使用忽略大小写 带行号grep-rmain./src/# 递归搜索整个目录findsearch for files— 文件查找find路径-name文件名模式find直接在磁盘上搜索文件功能极其强大但选项复杂。入门先记住最常用的-name# 在家目录下搜索名为 test.c 的文件find~-nametest.c# 在当前目录下搜索所有 .cpp 文件find.-name*.cpp⚠️ 在大文件系统上跑find可能很慢。如果搜索范围超过几十 GB考虑放到后台执行。whichlocate a command与whereislocate binary/source/manual— 定位命令whichls# 显示 ls 命令的可执行文件路径# 输出: /usr/bin/lswhereisls# 显示命令的二进制文件、源码和手册页位置# 输出: ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz本节要点Linux 文件系统是一棵树绝对路径从/开始相对路径从当前位置开始两者各有适用场景ls -lcdpwd是导航三件套cd -能让你在两个目录间高效切换rm -rf没有回收站执行之前确认路径——Boss 不接受不小心删了less比more好用支持上下翻页和双向搜索大文件不卡顿管道|是命令行的编程接口head -200 temp.txt | tail -20这种组合值得内化文件名不是文件的固有属性它只是目录里的一条映射。mv重命名的极快速度正源于此inode 是文件的身份证存储了权限、时间、所有者等所有元数据——文件名不在其中文件 属性 内容stat读 inodecat读数据块两者访问的是不同层次每个文件维护三个时间戳atime访问、mtime修改、ctime状态变更不要背选项知道命令叫什么就够了。当场man或--help把记忆力留给理解为什么这样设计