在计算机软硬件层次结构中,操作系统处于承上启下的关键位置,贯穿整个计算栈:
应用软件 (MS Office、VS Code、浏览器等)
↓ ← 系统调用接口(贯穿点)
操作系统 (Windows、Linux、macOS) ← 核心管理者
↓ ← 设备驱动接口(贯穿点)
设备驱动 (网卡、声卡、显卡驱动)
↓ ← 硬件抽象层(贯穿点)
硬件 (CPU、内存、硬盘、外设)几乎我们所有的软件行为,最终都与操作系统直接或间接相关,因为:
早期计算机直接通过硬件电路控制,随着硬件功能不断完善和结构复杂化,需要专门的软件来协助硬件控制和管理,操作系统应运而生。它通过设备驱动实现模块化的硬件管理。
无论是图形化界面还是命令行界面,其本质上都是一样的 → 而命令行操作更加贴近操作系统
凡是能被读写的都可以认为是文件
/usr/bin/)中查找对应指令
which [指令]查找指令所在路径
alias [name]=[指令]可以临时重命名指令
ls -l == ll的原因:ll通常是ls -l的预设别名(alias),用于简化操作。可以使用alias命令查看系统中的所有指令别名。
ls [选项] [目录或文件]-l:详细列表显示(可简写为 ll)
-a:显示所有文件(包括隐藏文件)
-d:显示目录本身而非内容
-F:在每个文件名后附上一个字符说明文件类型
ls -la(显示所有文件的详细信息)
指令是可以携带选项的 → 通过选项获得更加详细的输出
*:匹配任意字符
[文件名].*:匹配指定名称的任何扩展名文件
*.[文件后缀]:匹配指定后缀的任何文件
案例:
ls * # 列出所有文件
ls test.* # 列出所有名为test的文件
ls *.c # 列出所有.c后缀的文件d:目录文件
-:普通文件
.:隐藏文件(以点开头的文件)
*:可执行的普通文件(使用ls -F时显示)
/:目录(使用ls -F时显示)
l:符号链接文件
b:块设备文件
c:字符设备文件
pwd # 打印当前工作目录cd [目录路径]cd ..:返回上级目录
cd ~:返回用户家目录
cd -:返回上一个访问的目录
cd /:返回根目录
/)开始的完整路径,具有唯一性
案例:
cd .. # 返回上级目录(相对路径)
cd /home/user/linux/ # 使用绝对路径切换
cd ../day02/ # 使用相对路径切换touch filename.txt # 创建新文件或更新文件时间戳mkdir [选项] [dirname]-p:递归创建多级目录mkdir dirname # 创建单个目录
mkdir -p a/b/c/d # 递归创建多级目录rmdir [选项] [dirname]-p:递归删除多级空目录rmdir dirname # 删除空目录
rmdir -p a/b/c # 递归删除空目录链rm [选项] [filename/dirname]-r:递归删除删除目录及其下所有文件
-f:强制删除,不提示
-i:删除前逐一询问确认
rm filename # 删除文件
rm -r dirname # 递归删除目录及其内容
rm -f filename # 强制删除,不提示
rm -i filename # 删除前询问确认注意:
rm是一个危险命令,Linux中没有回收站机制,删除后难以恢复
cp [选项] [源文件或目录] [目标文件或目录]目标目录下不能有重名文件
-f:强制复制,覆盖已存在文件
-i:覆盖前询问用户
-r或-R:递归复制目录及其内容
可以发现它和
rm的选项几乎一模一样
cp file1.txt file2.txt # 拷贝单个文件
cp -r dir1/ dir2/ # 递归拷贝目录
cp file1.txt file2.txt /home/user/dest/ # 拷贝多个文件到目录
cp file1.txt /nonexistent_dir/ # 错误:目标目录不存在补充说明:
cp 命令同时指定多个源文件/目录时,最后一个参数必须是已存在的目标目录
mv [选项] 源文件或目录 目标文件或目录-f:强制移动,覆盖已存在文件
-i:覆盖前询问用户
mv file.txt /path/to/destination/ #移动文件
mv oldname.txt newname.txt #重命名文件
mv file.txt /path/to/newname.txt #移动并重命名所有的 mv 操作都可以统一视为**“剪切并重命名”** 重命名文件 → 将该文件剪切并重命名于当前目录
mv oldname.txt newname.txt→mv oldname.txt ./newname.txt/
cat [选项] [文件名]-n:给所有行编号
-b:给非空行编号
-s:不输出连续空行
cat # 键盘输入 1,则显示器输出 1
cat filename.txt # 查看文件内容当 cat 后面无目标时,则默认从输入设备读取数据
nano filename # 使用nano编辑器快捷键:Ctrl+X退出,Y保存,N不保存,Enter确定
<:从指定文件读取数据cat < [文件名] # 读取文件内容
cat < file.txt # 从文件读取现阶段我们可以近似认为
cat filename == cat filename
>:清空目标文件后写入新内容
>>:在目标文件末尾追加内容
echo [字符串] (> [文件名]) # 打印字符串或写入文件
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
//也可以用 printf -- 默认不带 换行符使用 输出重定向
>时, 若目标文件不存在则会自动创建一个**(类touch 功能)**
echo hello → echo "hello")
所以
echo指令默认将信息输向显示器这个文件,重定向就是改变其目标文件 — Linux 中一切皆文件
许多指令除了可以用选项修饰外,还可以直接操作指定路径下的文件:
# 使用ls查看指定路径的文件
ls [目录]/[文件名] # 查看指定路径下的文件
ls ../[文件名] # 查看上级目录中的文件
# 使用rm删除指定路径的文件
rm [目录]/[文件名] # 删除指定路径下的文件
rm ../[文件名] # 删除上级目录中的文件
# 其他命令同样适用
cat /path/to/file # 查看指定路径文件内容
mkdir /path/to/dir # 在指定路径创建目录more [选项] [文件]和
cat功能类似,但more更适合用于查看大文本文件,支持分页显示
-n 对输出的所有行编号q退出less [参数] [文件]比more更强大,支持上下翻页和搜索
-i:忽略搜索时的大小写
-N:显示每行的行号
/字符串:向下搜索
?字符串:向上搜索
n:重复前一个搜索
N:反向重复前一个搜索
q:退出
head [参数] [文件]显示文件开头部分,默认显示前10行
-n<行数> 指定显示的行数tail [参数] [文件]显示文件末尾部分,默认显示后10行
-n<行数>:指定显示的行数
-f:循环读取,实时监控文件变化(常用于查看日志)
组合使用案例:
# 获取文件的第50行内容
seq 1 100 > test # 生成1到100的序列装入test
//不用 less 搜索如何获取文件中间部分内容?
# 方法1:使用临时文件
head -50 test > tmp
tail -1 tmp
# 方法2:使用管道 |是
head -50 test | tail -1管道也可以看成一个临时文件,用于传输数据 — 右侧 → 左侧 支持流水线工作
find [目录] [选项] [操作]find命令功能强大,提供了相当多的查找条件 ---- 只要有访问权限就能查
-name:按照文件名查找文件案例:
// 按文件名匹配
find ~ -name test.c # 从 /home 目录开始查找名为 test.c 的文件
// 按文件后缀匹配
find ~ -name *.c # 从 /home 目录开始查找文件后缀为 .c 的文件
// 在其他路径查找
find /usr/bin -name ls # 从 /usr/bin 目录开始查找名为 ls 的文件注意:find命令可能访问磁盘,消耗资源较多
which [选项] [命令名]which命令用于查找可执行文件的绝对路径
-a:显示所有匹配的路径,而不仅仅是第一个案例:
which ls # 查找ls命令的路径
which grep # 查找grep命令的路径
which -a python # 查找所有名为python的可执行文件路径
which git # 查找git命令的路径whereis [选项] [文件名]whereis命令用于查找程序的二进制文件、源代码文件和手册页
-b:只查找二进制文件
-m:只查找手册页文件
-s:只查找源代码文件
案例:
whereis ls # 查找ls相关的所有文件
whereis -b gcc # 只查找gcc的二进制文件
whereis -m printf # 查找printf的手册页
whereis python # 查找python相关的所有文件总结对比:
find:功能最强大,可在任意指定路径深度搜索,支持复杂条件
which:专门用于查找可执行命令,只在PATH路径中搜索
whereis:在系统标准目录中查找程序的二进制、源码和手册页
grep [选项] [目标字符串] [目标文件]grep命令是强大的文本搜索工具:在文本文件中搜索字符串,并将匹配行打印出来
-i:忽略大小写的不同,所以大小写视为相同
-n:顺便输出行号
-v:反向选择,亦即显示出没有’搜寻字符串’内容的那一行
案例:
grep "hello" file.txt # 在file.txt中搜索包含"hello"的行
grep -i "error" logfile.log # 忽略大小写搜索"error"
grep -n "function" script.js # 显示匹配行及行号
grep -v "debug" config.conf # 显示不包含"debug"的行# 压缩
zip 压缩文件.zip 目录或文件
# 解压
unzip 压缩文件.zip [-d 目标目录]-r:递归处理,将指定目录下的所有文件和子目录一并处理案例:
zip test2.zip test2/* # 将test2目录压缩
unzip test2.zip -d /tmp # 解压到tmp目录tar [-cxtzjvf] 文件与目录... [参数]参数:
-c:建立一个压缩文件的参数指令(create的意思)
-x:解开一个压缩文件的参数指令
-t:查看tarfile里面的文件
-z:是否同时具有gzip的属性?亦即是否需要用gzip压缩?
-j:是否同时具有bzip2的属性?亦即是否需要用bzip2压缩?
-v:压缩的过程中显示文件
-f:使用档名,在f之后要立即接档名
-C:解压到指定目录
案例:
# 将整个/etc目录下的文件全部打包
tar -cvf /tmp/etc.tar /etc # 仅打包,不压缩!
tar -zcvf /tmp/etc.tar.gz /etc # 打包后,以gzip压缩
tar -jcvf /tmp/etc.tar.bz2 /etc # 打包后,以bzip2压缩
# 查阅tar文件内容
tar -ztvf /tmp/etc.tar.gz
# 解压缩
tar -zxvf /tmp/etc.tar.gz -C /usr/local/src
# 只解压特定文件
tar -zxvf /tmp/etc.tar.gz etc/passwd
# 备份并保留权限
tar -zxvpf /tmp/etc.tar.gz /etc特别注意:
f之后的文件档名是自己取的,习惯上用.tar作为辨识
.tar.gz或.tgz代表gzip压缩过的tar file
.tar.bz2作为附档名
date [选项]... [+格式]显示格式:
%H : 小时(00…23)
%M : 分钟(00…59)
%S : 秒(00…61)
%X : 相当于 %H:%M:%S
%d : 日 (01…31)
%m : 月份 (01…12)
%Y : 完整年份 (0000…9999)
%F : 相当于 %Y-%m-%d
设置时间(需要root权限):
date -s "2023-10-15 12:30:00"
date +%F(%Y-%m-%d)_%H:%M:%S 时间戳操作:
date +%s # 获取当前时间戳
date -d@1508749502 # 时间戳转换为时间cal [选项] [[[日] 月] 年]-3:显示系统前一个月,当前月,下一个月的月历
-j:显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
-y :显示当前年份的日历
案例:
cal # 默认查看当前月日历
cal 2025 # 查看2025年整年日历
cal 9 2025 # 查看2025年9月日历
cal 18 9 2025 # 查看2025年9月18号日历
cal -3 # 查看前一月、当前月、下一月的日历
cal -y # 查看当前年整年日历bc # 进入计算器模式功能:bc命令可以很方便的进行浮点运算,支持交互式计算。
uname [选项]功能:uname用来获取电脑和操作系统的相关信息。
常用选项:
-a或--all:详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称特别选项:
uname -r:显示内核版本信息gcc source.c -o output # 编译C程序./output # 执行编译后的程序whoami # 显示当前登录用户名/root(只能有一个管理员)
/home/username(可以有多个用户)
# 首先安装tree工具(需要root权限)
yum install -y tree
# 使用tree命令
tree [目录名] # 以树状形式显示目录结构clear # 清空当前终端显示内容shutdown [选项] 常见选项:
-h:将系统的服务停掉后,立即关机
-r:在将系统的服务停掉之后就重新启动
-t sec:-t后面加秒数,亦即『过几秒后关机』的意思
Linux中有很多选项,我们不可能全记住,此时我们就能通过查阅数据手册来获取帮助
man [选项] [命令/函数]-k:根据关键字搜索联机帮助
num:只在第num章节找
-a:显示所有章节的内容
若不指定章节,man会从第1章开始逐个搜索,直到找到匹配项 使用
Ctrl + Z退出手册
Linux 采用树形目录结构,特点包括:
/)为唯一起点
Linux的目录结构整体是一个多叉树:
.:当前目录
..:上级目录
~:当前用户家目录
就像在C语言中创建了一个变量,即使没初始化,也会占据内存空间(如int类型占4字节),创建空文件时,系统也需要存储其属性信息。
所有 ls + 选项的操作都是针对文件属性的,因为它们主要显示文件的元数据信息而非文件内容。
在 Linux 中,所有文件操作本质上都是对多叉树结构的增删查改。
Tab:具有『命令补全』和『档案补齐』的功能
Ctrl + Shift + C/V:复制/粘贴(需要加Shift键)
Ctrl + C:强制终止当前命令
Ctrl + D:通常代表着『键盘输入结束(End Of File, EOF 或 End OfInput)』的意思;另外,他也可以用来取代exit
Alt + Enter:打开/取消Shell全屏显示
Ctrl + Z:退出手册或暂停当前进程
案例:
while :; do echo "hello linux"; done # 无限循环输出
# 使用Ctrl+C终止该命令通过修改~/.bashrc文件,可以实现rm命令的安全改造:
vim ~/.bashrc # 修改配置文件
# 添加以下内容:
mkdir -p ~/.trash # 创建回收站目录
alias rm=trash # 将rm重定向到trash函数
alias ur=undelfile # 设置恢复命令
undelfile() {
mv -i ~/.trash/\$@ ./
}
trash() {
mv $@ ~/.trash/
}这样配置后:
rm命令会将文件移动到~/.trash目录而不是直接删除
ur命令可以恢复被"删除"的文件
man command
通过系统学习和不断实践,逐步建立起对Linux操作系统的深入理解,为后续的系统编程和网络编程打下坚实基础