注:
1.在xshell中:alt+enter==全屏/退出全屏
2.编译c语言程序:gcc 文件名.c;编译c++程序:g++ 文件名.c++
核心总述
指令是操控 Linux 系统的基本方式;学习 Linux 指令本质:对文件内容、文件属性进行操作。
Linux 文件模型:文件 = 文件内容数据 + 文件属性数据(元信息),文件内容和文件属性都是数据都要占用磁盘空间,系统需要存储它的属性信息,空文件也要占磁盘空间,因为要保存文件属性。
Linux 整体目录结构:树形结构,/ 为根目录
文件两大分类:1.普通文件:文本、源代码、可执行程序等;2.目录(文件夹):存放其他文件的载体
1、ls 罗列目录文件信息
java
ls # 罗列当前路径下文件或目录名称(不显示隐藏文件)
ls -l # 展示当前路径下的文件或目录的更加详细属性信息,不会再显示当前目录的目录中的内容
ls -Rl # 展示当前路径下的文件或目录的更加详细属性信息,并显示当前目录的目录中的内容
ll == ls -l # ll 不是独立命令,是 ls -l 的系统别名
ls -a # 显示所有文件,包含以 . 开头的隐藏文件
ls -al等价ls -a -l # 选项可以组合,表示看详情+隐藏文件
ls 文件名 #显示输入的文件名
ls -l 文件名 #详细显示输入的文件名信息
ls -l 目录名 #显示目录中的可见文件或目录的详细信息
ls -dl 目录名 #只显示目录名的详细信息,-d表示不进入目录,显示目录本身
注意:
执行ls -a 指令,显示出来的隐藏文件. 代表当前目录,... 代表上级目录
执行ls -al指令, 输出首字符含义:d开头表示目录;-开头表示普通文件
2.pwd & cd 路径相关指令
pwd作用:打印当前所在工作目录
其中Windows 路径分隔符 \;Linux 路径分隔符 /
cd 切换目录
java
cd 目标路径 # 切换到指定目录
cd .. # 回到上一级目录
cd - # 在最近访问的两个目录来回切换
cd ~ # 切换到当前用户家目录(等价直接输入cd)
注意:到达 /根目录 后继续cd ...不会报错,但依旧停留在根目录,无法继续向上回退。
java
# 错误!不能直接执行目录
....../dir/dir1/
# 正确:进入目录用 cd
cd ....../dir/dir1/
# 正确:运行里面的可执行程序
....../day1/a.out
路径概念
1.绝对路径:从根目录 /开始完整书写,唯一定位文件 示例:/usr/bin/hello.txt
优点:不受当前所在目录影响,任何位置都能直接使用,全局唯一
2.相对路径:基于当前所在目录进行定位,不写 /开头
示例:./test.exe
可选工具tree:
tree
tree(树形展示目录):作用:以树状打印目录下所有文件与子文件夹。
若提示 command not found,需要安装:CentOS 安装:yum install -y tree;ubuntu:apt install -y tree
使用Windows终端创建目录:win+x,点击终端(管理员),在D盘创建目录。从Windows10开始,Windows可以执行一些简单Linux命令
3.rm & rmdir 删除
java
注意:rmdir 只能删除空目录(也就是说该目录下没有其他目录和文件,就算是空的目录和文件也不行)
rmdir 目录名
rm 文件名:默认删除普通文件
注意:rm 目录名 直接执行会报错:`Is a directory`,rm 默认不能直接删目录
rm -r 目录名 :-r == recursive:递归删除目录,先删除目录内部所有内容,再删除目录本身
rm -rf 目录名:f:force,强制删除;不弹出确认提示,忽略不存在文件强制递归删除,谨慎使用!
-i:删除前交互式询问确认(输入 y 确认,n 取消)
rm -i 文件名 #删除文件时询问一下我
小结: 普通用户使用sudo touch root.txt创建 root 所属文件,普通用依然可以rm删除
Linux是一个企业后端服务器,上面会部署很多重要的服务,MySQL数据库有大量的用户数据。
危险示例:rm -rf / 会尝试删除系统根目录,直接摧毁操作系统
4.文件类型识别(ls -l 首字符)
java
- 普通文件(文本、可执行程序等)
d 目录文件夹
常用指令小结:
java
pwd # 查看当前所在路径
ls # 列出当前目录文件(不显示隐藏文件)
ls -l # 查看文件详细属性
ls -l 【目录名/文件名】 #不进入目录,但可以查看目录中的文件和目录信息或文件名
ls -dl 【目录名/目录名】 #不进入目录只显示当前目录信息
ls -a # 显示隐藏文件
ls -al # 组合参数,详情+隐藏文件
ls -Rl #递归列出当前目录及所有子目录里的内容
ls -n #用 UID、GID 数字代替用户名、组名
ls -i #-i显示文件 inode 编号
cd 路径 # 切换目录
cd .. # 回到上级目录
cd ~ # 切换到当前用户家目录
cd - # 在最近两个目录来回跳转
touch test.txt # 创建空普通文件
stat test.txt # 查看文件完整属性(Access/Modify/Change三个时间)
mkdir dirname # 创建单层目录
mkdir -p a/b/c # 递归创建多级目录
rm 文件名 # 删除普通文件
rm -rf 目录名 # 强制递归删除目录 ⚠高危命令,谨慎使用
rmdir 目录名 # 仅能删除空目录(极少使用)
注意:\ 作用:命令太长,换行继续输入如下;当我们在编写代码时,如果代码过长我们也可以使用\换行。
举例:
java
# 换行续行:反斜杠 \
ls \
-a \
-l \
-i
5.Linux 下 C/C++ 代码编译演示
java
vim test.cpp # 使用vim编辑器编写C++源码
g++ test.cpp # 编译,默认生成可执行程序 a.out
./a.out # 在当前路径下,运行可执行文件
流程:编写源码 → 编译生成二进制可执行文件 → 在 Linux 系统运行

6.touch命令
touch两条核心作用:
1.文件不存在:创建普通空文件
java
touch myfile.txt
touch a b c # 一次性创建多个空文件
2.文件已经存在:更新文件的时间戳,不会新建同名文件

7.stat 命令
查看文件详细信息

Linux 文件三种时间:
- Access(atime)访问时间:文件被读取
- Modify(mtime)修改时间:文件内容发生变化
- Change(ctime)改动时间:文件属性(权限、大小、文件名等)变化
- ll 默认展示的是 Modify(mtime),如下图所示:

8.mkdir创建目录(文件夹)
java
mkdir new_dir # 创建单层空目录
mkdir a/b/c/d # 报错,父目录a、b、c不存在
mkdir -p a/b/c/d # 成功,一次性创建整条路径
9.man 手册(帮助文档)章节编号
man 用来查看命令、系统调用、库函数官方手册,手册分为 9 个 section,重点了解常用的前三个:
- Executable programs or shell commands 用户命令、可执行程序(日常 shell 指令,如 ls、rm)
- System calls 系统调用(内核提供接口,open/read)
- Library calls C 语言库函数(printf、malloc)
- Special files 设备文件(/dev 下硬件文件)
- File formats 配置文件格式(/etc/passwd)
- Games 游戏
- Miscellaneous 杂项、规范、宏
- System administration commands 管理员命令(root 使用)
- Kernel routines 内核函数(非标准)
使用规则:
java
man printf # 默认查找1号章节:shell内置printf命令
man 3 printf # 指定查看3号章节:C库printf函数
安装手册包(CentOS/RHEL)
java
yum install -y man-pages或sudo yum install -y man-pages
注意:需要root用户操作
java

man是一个查看命令,系统调用,c接口的一个手册!
man默认是从1号手册开始查找,找到就暂停
man也可以根据知道手册查找:man 1/2/3 命令/接口/C
10.echo 输出 + 文件重定向 >
echo "内容" #将内容显示到显示器上的指令,原封不动显示原来的内容
java
#将内容重定向到文件中
echo "内容" > 文件名
举例:
java
echo "hello" #直接原样输出hello
# 注意:echo 不识别 %d 这类格式化占位符,printf才支持
echo "hello %d" # 直接原样输出 hello %d
echo "hello world" > file.txt
echo "ws" > file.txt
cat file.txt #输出ws
#注意:> 会覆盖原有文件内容!
> file3.txt # 创建空文件;文件已存在直接清空
cat file.txt #什么都不输出
echo "" > file2.txt# 文件内带有空换行
11.cp(copy) 复制命令
可以拷贝目录或者文件, -r -f -i
使用格式:
java
cp 源文件 目标路径
cp -r 目录 目标路径
举例:
java
注意:cp 默认只能复制普通文件,不能直接复制目录
如果要复制目录,需要在源文件前面加 -r
cp -r 目录 目标路径
cp -i 文件名 目标路径 #拷贝时如果目标路径有同名文件添加-i会提示我是否要覆盖
补充指令:
cat 文件名 #将文件中的内容显示到显示器上
12.mv 命令(move,移动 / 重命名)
两大核心功能:
1.移动文件 / 目录(类似 Windows 剪切)
java
# 文件移动到目录内
mv 源文件 目标目录
# 目录整体移动到另一个目录,不用带-r
mv 源目录 目标目录
2.重命名文件 / 目录,注意文件格式变不了
java
mv 原文件名 不存在的新文件名 # 文件重命名
mv 原目录名 新目录名 # 目录重命名
可选根据nano:
java
# 安装nano文本编辑器
yum install -y nano #注意要在root用户下安装
sudo:临时获取管理员权限
yum:CentOS 系统包管理器
-y:全部安装询问自动选 yes,无需手动确认
使用格式:
java
nano 文件名
#保存退出:Ctrl+O 保存 → Ctrl+X 退出
需要保存退出:Ctrl+X → Y → 回车
不保存直接退出:Ctrl+X → N
13.Linux 文件查看命令:cat/tac/more/less
执行shell脚本
java
cnt=0; while [ $cnt -le 10000 ] ; do echo "hello ws [$cnt]"; let cnt++; done
一、cat 命令:一次性将文件全部内容输出到终端
java
cat 文件名
cat -n 文件名 #-n参数:字母n显示所有行号
缺点:不适合超大文件,内容会一次性刷屏,无法分页浏览。适合小文件、代码片段。
二、tac 命令:cat 倒过来拼写,倒序打印文件内容(最后一行最先输出)
java
tac 文件名
三、more 分页查看命令
分页浏览大文件,按空格向下翻页,按回车向下翻一行,q 退出。
java
# -数字:指定每屏显示多少行
more -5 文件名
搜索:先执行more 文件名,然后在显示的内容中输入:/要搜索的内容,就好了。
四,less
more 的升级版,支持上下【按上下键】滚动、搜索,推荐查看日志 / 大代码,q退出
java
less 文件名
less -N 文件名 #显示行号
搜索:/+关键词
五,只看文件头部 (head)/ 尾部(tail)
head:查看文件开头,默认前 10 行
java
head 文件名
head -6 文件名 # 查看前6行
tail:查看文件末尾,默认最后 10 行
java
tail 文件名
tail -3 文件名 # 最后3行
tail -f 文件名 # 持续跟踪文件新增内容(实时看日志)
14.Linux 管道 |
一、需求场景:提取文件中间指定区间行
目标:取出 test.txt 第 1000~1009 行(共 10 行)
java
方案1:缺点:产生额外磁盘文件,操作繁琐。
# 先把前1010行保存到临时文件
head -1010 test.txt > tmp.txt
# 再取临时文件最后10行
tail -10 tmp.txt
方案2:head -1010 test.txt | tail -10
管道作用: 把前一条命令的标准输出,直接当作后一条命令的标准输入,数据在内存流转,不落地生成文件。
二、管道链式调用(多条管道连续拼接)
java
# 1.取出1000~1009行 → 2.整段倒序 → 3.取前三行
head -1010 test.txt | tail -10 | tac | head -3
三、管道核心特征
功能本质:传输数据流(资源)
结构:一端入口、一端出口
特点:内存数据流,不产生中间磁盘文件
四,补充知识
三个标准文件指针(stdio.h)
java
extern FILE *stdin; // 标准输入(默认键盘)
extern FILE *stdout; // 标准输出(默认显示器)
extern FILE *stderr; // 标准错误(默认显示器)
#进程启动时自动打开,不需要手动 fopen
字符读写函数
java
int fgetc(FILE *stream):从文件中读取
返回值:读到的字符(unsigned char 转 int);到达末尾 / 出错返回 EOF
getchar() ≡ fgetc(stdin)
int fputc(int c, FILE *stream):往显示器中打印
putchar(c) ≡ fputc(c, stdout)
举例:
test.txt文件中的内容:
java
cnt=0; while [ $cnt -le 1500 ] ; do echo "hello world [$cnt]"; let cnt++; done > test.txt
java
#include <stdio.h>
int main()
{
int c;
// 从标准输入逐个读取字符
while( (c = fgetc(stdin)) != EOF )
{
fputc(c, stdout); // 原样输出到标准输出
}
return 0;
}
gcc -o change change.c
#交互式:./change
#和管道结合:
管道把前序命令的标准输出,作为 ./change 的标准输入 (stdin);
程序读取管道数据流,再原样从 stdout 输出。
head -1010 test.txt | tail -10 | ./change
续:将字符转大写
java
#include <stdio.h>
#include <ctype.h>//man tolower
int main()
{
int c;
// 从标准输入持续读取字符,直到EOF
while( (c = fgetc(stdin)) != EOF )
{
c = toupper(c); // 转大写
fputc(c, stdout); // 输出到标准输出
}
return 0;
}
gcc -o change change.c
将文件中的内容转为大写显示到显示器上,注意change文件要与要显示的文件在同一个目录层级中
java
head -1010 test.txt | tail -10 | tac | head -3 | ./change
15.date 日期格式化命令
java
#输出国外时间
date
#举例
date +%Y-%m-%d #2026-07-27
date +%Y-%m-%d/%H:%M:%S #2026-07-27/21:03:26
date +%s #输出时间戳:1785157431
#注意:+后面不能有空格,整体格式串连续书写
#时间戳 → 可读时间(-d @时间戳)
date +%Y/%m/%d-%H:%M:%S -d@1785157431 #输出:2026/07/27-21:03:51
| 符号 | 含义 |
|---|---|
| %Y | 4 位年份 |
| %m | 两位月份 (01~12) |
| %d | 两位日期 (01~31) |
| %H | 24 小时制小时 |
| %M | 分钟 |
| %S | 秒 |
| %s | 时间戳(从 1970-01-01 到现在总秒数) |
16.cal日历命令
java
cal # 显示当月日历
cal 2022 # 显示一整年日历
cal -3 # 显示上月、当月、下月(三个月视图)
17. 文件查找命令find/whereis/which
find:查找某个路径下的所有文件名,并显示这些文件名所在路径,注意:这里的路径下还可以有路径
缺点:当我们使用find搜索的时候,可能需要访问磁盘进而导致效率低下;搜索根目录需要sudo权限。
java
find 搜索路径 -name "文件名"
#举例:
# 在/目录下查找名为test.c的文件
find /root -name test.c
# 全盘搜索stdio.h(需要root权限,加sudo)
sudo find / -name stdio.h
搭配通配符:find . -name "*.c" 查找所有 C 源码
管道流水线 + find 示例:
java
find . -name "*.txt" | xargs cat | ./change
whereis:在特定路径下,查找指定的文件名对应的指令或文档,查找命令程序、man 手册、源码相关文件【近似查找】
java
whereis ls
whereis test.c # 无法找到普通文件test.c
which: 作用:查找命令所在系统路径,同时展示命令别名。
可以识别alias别名,会先打印别名定义,再显示原始命令路径
举例:
java
which ls
which ll
查找速度:which > whereis > find
查找范围:which < whereis < find
18.alias 命令(命令别名)
作用:给已有命令命令重命名(起别名)
java
alias 别名='原始指令'
举例:
java
# ll 本质就是 ls -l --color=auto
alias ll='ls -l --color=auto'
# 自定义别名zhangsan映射top
alias zhangsan='top' #注意=左右两边不能有空格
# 覆盖修改已有别名
alias zhangsan='ls -l --color=auto'
which ll
#取消别名
unalias zhangsan
19.grep 文本内容行过滤工具
grep作用:匹配文本中的关键字,匹配上的进行行显示
java
grep [选项] "关键词" 文件名
常用选项:
注意:选项可以组合使用:如 -ni, -niv等。
| 选项 | 功能 |
|---|---|
| -n | 显示匹配行的行号 |
| -i(ignore) | 忽略大小写匹配 |
| -v | 反向匹配:输出不包含关键词的行 |
与管道的结合使用举例:
java
# 筛选含999的行,交给wc -l统计行数,-l表示line
grep 'hello world' test.txt | wc -l
20.sort 文本排序命令
sort作用:对文本内容按ASCII 码逐行排序(默认不会修改原文件,只输出排序结果)
举例:
java
file.txt内容:
22222
22222
22222
11111
5555
5555
5555
3333
4444
5555
#执行全文排序,不会比较数的大小:
sort file.txt
#执行 uniq file.txt
只会删掉连续相邻的重复,末尾单独的5555会保留,无法实现全文全部去重。
#执行全文去重:sort file.txt | uniq

21.打包压缩:zip /unzip 压缩解压(CnetOS)&tar
为什么需要打包和压缩?
- 多个文件 / 目录合并为单个文件传输,避免文件零散、部分丢失;
- 压缩减小体积,节省磁盘空间、提升网络传输效率。
区分概念:
打包:多个文件合成一个文件,体积基本不变;
压缩:通过算法减小文件占用空间。
安装软件包:
java
yum install zip unzip
zip 压缩
java
格式:zip [选项] 压缩包名 待压缩文件/目录
注意:压缩目录(必须带 -r :recursive)
注意:zip默认对一个目录进行打包压缩的时候,只会对目录文件打包压缩,此时不用加-r,压缩时连带目录中的内容要加-r。
unzip 解压
java
unzip 压缩文件名 #在当前目录下进行解包解压的功能
# 解压到【指定目录】 -d
unzip 压缩包名 -d 指定目录路径
tar(Linux 最常用打包并压缩工具,支持 gzip 压缩,后缀 .tgz / tar.gz)
选项:
java
c create 创建打包文件
x extract 解包
z 使用 gzip 压缩算法
f 指定压缩包名称(f 必须放在所有选项最后)
v verbose 解压/压缩时,同步显示压缩文件列表
t list 只查看压缩包内部文件,不解压压缩包内容
-C 指定解压目标目录(大写 C)
举例:
java
# 打包+压缩
tar -zcf 新建压缩包名 目录
tar -zcvf 新建压缩包名 目录
# 解包+解压(默认解压到当前目录)
tar -zxf 压缩包名
tar -zxvf 压缩包名
#解压到指定目录
tar -xzf 压缩包名 -C 指定路径
# 查看压缩包内容(不解压)
tar -ztf 压缩包名
tar -tf 压缩包名
#解压到指定目录
tar zxvf 压缩包名 -C ~ #将文件解压到家目录下
zip VS tar 简单对比
- zip打包目录必须 -r,忘记就只会得到空目录。
- **tar(tgz)**打包目录不需要额外递归参数。
常用知识点补充
bc 计算器 + 管道 |
交互式使用:直接输入 bc,输入算式,quit 退出 管道一行计算(脚本常用)
举例:
| 管道:把前一条命令的输出,交给后面命令作为输入
java
echo "1+2+3+4+5" | bc
系统信息命令
java
uname # 只输出系统名称 Linux
uname -a # 完整系统内核信息
uname -r # 只打印内核,查看计算机体系结构

注意:el7:EL = Enterprise Linux,对应CentOS7;x86_64:计算机体系结构,也就是CPU架构
常用终端快捷键
| 快捷键 | 作用 |
|---|---|
| Tab | 命令 / 文件名自动补齐 |
| Ctrl + c | 终止当前前台运行的程序 |
| Ctrl + r,然后输入曾经历史命令片段 | 搜索历史执行过的命令 |
| Ctrl + d | 退出当前 shell 会话/退出当前用户,退出一层 |
file:查看文件类型,Linux 可执行程序格式:ELF 64-bit LSB executable
java
file 文件/目录名
系统硬件信息查询
java
lscpu # 查看CPU详细信息
lsmem # 查看内存分布、总内存大小
df -h # 查看磁盘分区使用情况(-h 人性化单位GB/M)
在线用户相关
java
who # 查看当前所有登录系统的在线用户
whoami # 查看我当前是谁(登录用户名)