Linux 基础 Day3:文件操作 · 文件查看 · 文件搜索(grep)
系列:粤嵌嵌入式培训学习笔记 (第 3 篇)
上一篇:Linux 基础 Day2:终端快捷键 · 文件系统 · 路径 · 文件类型 · 目录操作
下一篇:内容预告待定
环境:Ubuntu 22.04 · bash | 2026年7月23日
① 概览
Day2 学会了"找东西"(路径、目录),Day3 开始真正"操作文件"——创建、删除、复制、移动、查看、搜索。
| 模块 | 涉及命令 | 一句话 |
|---|---|---|
| 文件操作 ⭐ | touchrmcpmv | 增删改移,rm递归删除机制是重点 |
| 文件查看 | catmorelessheadtail | 小文件cat,大文件less,看头尾用head/tail |
| 文件搜索 ⭐ | grepfindlocatewhich | grep 四大选项 + 正则行首行尾 / find 五大条件 / locate 快速查 / which 查命令位置 |
| 管道与输出 | |echo>>> | 管道串联命令 / echo 输出 + 覆盖写入>/ 追加写入>> |
② 文件操作 ⭐
2.1 touch — 创建文件
touch文件路径注意:touch的本职是更新文件时间戳,文件不存在时才顺便创建。
# 创建单个文件yueqian@st-vm:/mnt/hgfs/linux/20260723$touchtest1.txt yueqian@st-vm:/mnt/hgfs/linux/20260723$ls-l总计0-rwxrwxrwx1root root01月11970test1.txt# 批量创建多个文件(空格分隔)yueqian@st-vm:/mnt/hgfs/linux/20260723$toucha.txt b.txt c.txt yueqian@st-vm:/mnt/hgfs/linux/20260723$toucha.c# 文件类型靠后缀区分# 用通配符只看 .txt 文件yueqian@st-vm:/mnt/hgfs/linux/20260723$ls-l*.txt-rwxrwxrwx1root root01月11970a.txt-rwxrwxrwx1root root01月11970b.txt-rwxrwxrwx1root root01月11970c.txt-rwxrwxrwx1root root01月11970test1.txt2.2 rm — 删除文件或目录
核心规则:
| 删什么 | 要不要-r | 举例 |
|---|---|---|
| 删文件 | 不需要 | rm a.txt |
| 删目录 | 必须加 | rm -r dir/ |
递归删除机制(重点理解)
目录结构: aDir1 ├── bDir1 │ ├── cFile1 │ └── cFile2 └── bDir2 ├── cFile1 └── cFile2执行rm -r ./aDir1的过程:从外层向内层查找 → 从内层向外层删除:
① 删除:./aDir1/bDir1/cFile1 (最内层文件) ② 删除:./aDir1/bDir1/cFile2 (最内层文件) ③ 删除:./aDir1/bDir1 (空目录) ④ 删除:./aDir1/bDir2/cFile1 (最内层文件) ⑤ 删除:./aDir1/bDir2/cFile2 (最内层文件) ⑥ 删除:./aDir1/bDir2 (空目录) ⑦ 删除:./aDir1 (空目录)🧠一句话:想删目录,先把它掏空。
实操演示
yueqian@st-vm:/mnt/hgfs/linux/20260723$mkdir-pless01/a/b less02/a/b less03/a less04/a test01 yueqian@st-vm:/mnt/hgfs/linux/20260723$touchless01/a/b/demo01.c test01/demo01.c demo01.c demo02.c demo01.txt# 删文件:直接 rm,不需要 -ryueqian@st-vm:/mnt/hgfs/linux/20260723$rmdemo01.c# ✅ 删文件成功# 删目录:不加 -r 就报错yueqian@st-vm:/mnt/hgfs/linux/20260723$rmless01 rm: 无法删除'less01':是一个目录# ❌ 报错yueqian@st-vm:/mnt/hgfs/linux/20260723$rm-rless01# ✅ 递归删除# 批量删除目录yueqian@st-vm:/mnt/hgfs/linux/20260723$rm-rless02 less03# 交互式删除(-i,每一步都确认)yueqian@st-vm:/mnt/hgfs/linux/20260723$rm-riless04 rm: 是否进入目录'less04'?yesrm: 是否删除目录'less04/a'?yesrm: 是否删除目录'less04'? no# 这里选了 no,目录保留# 通配符批量删yueqian@st-vm:/mnt/hgfs/linux/20260723$rm-r*.txt test*重要选项
| 选项 | 功能 | 使用场景 |
|---|---|---|
-r | 递归删除目录及其内容 | 删除目录时必须使用 |
-f | 强制删除,不确认 | 批量删除或脚本中使用 |
-rf | 强制递归删除 | ⚠️ 危险操作!删了无法恢复 |
⚠️
rm -rf没有回收站。养成习惯:删之前先ls确认。
2.3 cp — 复制文件或目录
cp[选项]源路径 目标路径基本用法
| 场景 | 命令 | 说明 |
|---|---|---|
| 文件 → 目录 | cp test1.txt less03/ | 复制文件到目录,文件名不变 |
| 目录 → 目录 | cp -r aDir less03/ | 复制目录必须-r |
| 批量复制 | cp -r aDir bDir less03/ | 多个源一次性复制到目标 |
拷贝 + 重命名
如果目标是文件名,cp会在复制的同时重命名:
# 实操演示yueqian@st-vm:/mnt/hgfs/linux/20260723$mkdirless01 less02 less03 yueqian@st-vm:/mnt/hgfs/linux/20260723$mkdir-paDir/aDir1 bDir/bDir1 yueqian@st-vm:/mnt/hgfs/linux/20260723$touchtest1.txt less01/test1.txt less02/test1.txt# ----- 拷贝到目录 -----yueqian@st-vm:/mnt/hgfs/linux/20260723$cptest1.txt less03 yueqian@st-vm:/mnt/hgfs/linux/20260723$lsless03 test1.txt# 名字不变# ----- 拷贝 + 重命名 -----# 目标是个文件名,触发重命名yueqian@st-vm:/mnt/hgfs/linux/20260723$cptest1.txt less02/test2-副本.txt yueqian@st-vm:/mnt/hgfs/linux/20260723$lsless02 test1.txt test2-副本.txt# 同一目录下拷贝+重命名yueqian@st-vm:/mnt/hgfs/linux/20260723$cptest1.txt test1-副本.txt yueqian@st-vm:/mnt/hgfs/linux/20260723$lstest1.txt test1-副本.txt aDir bDir less01 less02 less03常用选项
| 选项 | 功能 |
|---|---|
-r | 递归复制,复制目录必须加 |
-i | 目标已有同名文件时,询问是否覆盖 |
# -i 交互确认:目标已有 test1.txt,问你要不要覆盖yueqian@st-vm:/mnt/hgfs/linux/20260723$cp-itest1.txt less03 cp: 是否覆盖'less03/test1.txt'?yes2.4 mv — 移动 / 重命名
mv[选项]源路径 目标路径核心逻辑:移动和重命名是同一个命令——因为"重命名"本质上是把文件"移到新名字的位置"。
| 命令 | 效果 | 场景 |
|---|---|---|
mv a.txt ../bDir/ | 移动 | a.txt 移到 …/bDir 目录下(bDir 必须已存在) |
mv a.txt b.txt | 重命名 | 同一目录下改名 |
mv a.txt ../b.txt | 移动 + 重命名 | 移走并改名 |
mv aDir bDir | bDir 存在→移动;bDir 不存在→重命名 | 看目标存不存在 |
mv less02 less03 *.txt aDir | 批量移动 | 多个源一起移 |
# 演示:mv aDir bDir 的两种情况mkdiraDir bDirmvaDir bDir# bDir 存在 → aDir 移入 bDir 内部lsbDir/# aDirmkdiraDirmvaDir newDir# newDir 不存在 → 重命名ls# newDir(没有 aDir 了)💡
mv移目录不需要-r——这一点和cp不一样,别搞混。
③ 文件查看
小文件用cat,大文件用less,看头尾用head/tail。
3.1 cat — 查看文件内容(小文件)
cat/proc/cpuinfo# 全量输出cat-n/proc/cpuinfo# -n 显示行号3.2 more — 分页查看
more/proc/cpuinfo| 快捷键 | 功能 |
|---|---|
空格键 | 向下翻一页 |
回车键 | 向下翻一行 |
q | 退出 |
3.3 less — 高级分页(推荐)
比more强大,支持上下翻:
less/proc/cpuinfoless-M/proc/cpuinfo# -M:左下角显示当前行范围| 快捷键 | 功能 |
|---|---|
空格键 | 向下翻一页 |
b | 向上翻一页 |
方向键 ↑↓ | 向上/向下翻一行 |
q | 退出 |
🆚more vs less:
more只能往下翻,less能上下翻。记法:less is more(less 功能更多)。
3.4 head — 查看文件头部
head/proc/cpuinfo# 默认前 10 行head-n5/proc/cpuinfo# 前 5 行,写法一head-5/proc/cpuinfo# 前 5 行,写法二(简写)3.5 tail — 查看文件尾部
tail/proc/cpuinfo# 默认后 10 行tail-n5/proc/cpuinfo# 后 5 行,写法一tail-5/proc/cpuinfo# 后 5 行,写法二(简写)④ 文件搜索 ⭐ grep
grep[选项]'待查找的字符串'文件路径# 引号可以省略,两种写法等价grep[选项]待查找的字符串 文件路径常用选项
| 选项 | 功能 | 举例 |
|---|---|---|
-n | 显示行号 | grep -n 'apicid' /proc/cpuinfo |
-c | 统计匹配行数(返回数字) | grep -c 'apicid' /proc/cpuinfo |
-i | 忽略大小写 | grep -i 'APICID' /proc/cpuinfo |
-v | 反向搜索(显示不包含的行) | grep -v 'processor' /proc/cpuinfo |
实操演示
# 基本搜索yueqian@st-vm:/mnt/hgfs/linux/20260723$grep-n'apicid'/proc/cpuinfo14:apicid:015:initial apicid:041:apicid:142:initial apicid:1...# 搜索不存在的字符串 → 无输出(不会报错)yueqian@st-vm:/mnt/hgfs/linux/20260723$grep-ni'apicid2'/proc/cpuinfo yueqian@st-vm:/mnt/hgfs/linux/20260723$# 空,什么都没找到# -c:统计匹配行数yueqian@st-vm:/mnt/hgfs/linux/20260723$grep-ci'apicid'/proc/cpuinfo8# -v:反向搜索yueqian@st-vm:/mnt/hgfs/linux/20260723$grep-cv'apicid'/proc/cpuinfo100⚠️
-c和-n不要一起用——统计只返回数字,显示行号没意义。
grep 正则表达式
^和$让 grep 定位更精确。
行首匹配^:以指定字符序列开头:
grep-n'^apicid'/proc/cpuinfo# 只匹配 apicid 开头的行# apicid : 0 ← 匹配# initial apicid : 0 ← 不匹配(开头是 initial)行尾匹配$:以指定字符序列结尾:
grep-n'[0-9]$'/proc/cpuinfo# 以数字结尾的行grep-n'[A-Za-z]$'/proc/cpuinfo# 以字母结尾的行💡
[0-9]表示 0~9 任意一个数字,[A-Za-z]表示任意一个字母。
find — 查找文件或目录
grep搜文件内容,find搜文件本身——从磁盘遍历查找,精确但慢。
find检索路径[选项]参数五大选项
| 选项 | 功能 | 举例 |
|---|---|---|
-name | 按名搜(区分大小写) | find ./ -name "test.c" |
-iname | 按名搜(忽略大小写) | find ./ -iname test1.txt |
-type | 按类型搜 | d目录 /f文件 /l链接 |
-size | 按大小搜 | +3M大于 /-3M小于 |
-mtime | 按修改时间搜 | -124h内 /+77天前 |
💡
-size默认单位是 512 字节。加 M 表示 MB(如+3M= 大于 3MB)。
实操演示
# 当前目录找 test1.txt,忽略大小写find./-inametest1.txt# 根目录下大于 3MB 的文件find/-size+3M2>/dev/null|head-10# 只找 /var/log 下的 .log 普通文件find/var/log-typef-name"*.log"2>/dev/null# 当前目录下找名为 src 的目录find./-typed-name"src"# 24 小时内修改过的文件find/-mtime-12>/dev/null|head-10# 不加单位时的默认单位:3 单位 = 3 × 512 = 1536 字节find/-size+32>/dev/null|head-10locate — 快速查找
find搜磁盘(慢但准),locate搜数据库(快但可能过时)。
locate[选项]文件或目录| 选项 | 功能 |
|---|---|
-c | 统计文件个数 |
-i | 忽略大小写 |
locate-itest.c# 忽略大小写搜,无需指定路径locate-c"*.txt"# 统计有多少 .txt 文件⚠️
locate不是实时搜磁盘,而是查预建的文件数据库(updatedb),每天自动更新一次。新创建的文件可能搜不到,需手动sudo updatedb。
🆚 find vs locate
| find | locate | |
|---|---|---|
| 查什么 | 磁盘 | 数据库 |
| 速度 | 慢 | 快 |
| 准度 | 准,实时 | 可能过时 |
| 需指定路径 | 需要 | 不需要 |
which — 查找命令位置
想知道一个命令的绝对路径在哪,用which:
whichls# 输出:/usr/bin/ls管道|— 命令组合
把前一个命令的输出,变成后一个命令的输入:
# 先 ls -l 列出所有文件,再从结果中 grep 筛选出 .txt 结尾的ls-l|grep".txt$"# 先 cat 打开 cpuinfo,再用 grep -c 统计 cpuid 出现次数cat/proc/cpuinfo|grep-c'cpuid'🧠管道
|vs 重定向>:管道连接命令,重定向连接文件。
echo — 输出字符串
echo"字符串">|>>文件路径| 符号 | 效果 |
|---|---|
> | 覆盖写入:先清空文件,再写入(文件不存在则创建) |
>> | 追加写入:不清空,在文件末尾添加 |
# 覆盖写入(之前的内容被清空)echo"yueqian is good!">yueqian.txt# 追加写入(保留之前内容,新内容加在末尾)echo"kaige is good!">>yueqian.txt⑤ 踩坑记录 ⭐
坑1:rm less01报"是一个目录"
- 现象:
rm: 无法删除 'less01': 是一个目录 - 根因:删文件不需要
-r,但删目录必须加-r(递归删除) - 解决:
rm -r less01
坑2:cp aDir报"omitting directory"
- 现象:
cp: -r not specified; omitting directory 'aDir' - 根因:
cp复制目录必须加-r - 解决:
cp -r aDir backup/
🆚 对比:
mv移动目录不需要-r。cp -r要加,mv不用加,这是最容易混的地方。
坑3:grep搜不到内容时没报错
- 现象:
grep 'xxx' file执行后啥也没输出,不确定是没搜到还是命令写错了 - 根因:
grep找不到匹配内容时,就是静默无输出,不是报错 - 解决:不确定时用
grep -c看统计数,返回 0 说明确实没有
⑥ 小结
今天完成:touch创建 →rm -r递归删除 →cp -r递归复制 + 拷贝重命名 →mv移动/重命名 → 5 种查看(cat/more/less/head/tail)→grep四大选项 + 正则^$→find五大条件 →locate快速查 →which查命令位置 → 管道|→echo+>/>>。
下一篇:待更新。
本文首发于 CSDN,转载请注明出处。