Linux(CentOS)系统管理入门笔记(第四期)------文件系统(下篇):文件与目录操作实战------cp/mv/mkdir/rm/ln
知识衔接:
Linux(CentOS)系统管理入门笔记(第三期)------文件系统(上篇):目录结构与路径导航------FHS 与 cdpwdls
Linux系统管理入门系列其他文章欢迎访问:Linux入门------系统管理1
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
写在前面:大家好,我是北冰洋whisky,从昨天开始,我正式启动了对以前一阶段笔记的"翻新"计划。一路学习到三阶段,经历了不少的坎坷,离步入工作的时间节点越来越近的同时,我倍感基本功扎实的重要性。因此,除了知识点笔记整理的这条主线,我也主动开辟了知识点自测的支线计划。希望在后面的日子里,也能与各位共同进步!
引言:文件操作,Linux 世界里的"整理术"
上期我们拿到了 Linux 的"城市地图"(FHS),学会了"导航"(cd/pwd/ls)。但你到了目的地之后,总得干点什么------也许是要把一份文件"复印"一份放到别处(复制),也许是"搬家"(移动),也许是要"建个新仓库"(创建目录),或者"扔掉不要的旧东西"(删除)。
这些听起来简单,但 Linux 的文件操作有着自己的一套规则和"坑":cp 复制目录要加 -r,否则报错;rm 删除后几乎是不可恢复的;mv 既能移动又能重命名,一念之间功能切换;软链接和硬链接看似相似,本质却截然不同。
此外,当你要操作 100 个文件时,一个"通配符"能顶 100 次敲键盘------这是命令行效率的真正体现。
本期,我们全面掌握文件与目录的增、删、改、查、移、链 六大操作,并学会用 Shell 扩展匹配(通配符) 实现批量处理。读完这一期,你将具备在 Linux 文件系统中自如"整理家务" 的能力。
--- Compiled and Authored by Whisky --- July 7 th, 2026
目录
- 创建目录:mkdir
- 复制文件与目录:cp
- 移动与重命名:mv
- 删除文件与目录:rm 与 rmdir
- 软链接与硬链接:ln
- Shell 扩展匹配:通配符的艺术
- 总结与速查手册
1. 创建目录:mkdir
mkdir(Make Directory)是创建目录的唯一命令。它看似简单,但有几个关键用法必须掌握。
1.1 基础用法
bash
# 在当前目录下创建一个目录
[whisky@centos7 ~]$ mkdir lab
[whisky@centos7 ~]$ ls -ld lab
drwxrwxr-x. 2 whisky whisky 6 7月 7 15:30 lab
# 同时创建多个目录
[whisky@centos7 ~]$ mkdir dir1 dir2 dir3
[whisky@centos7 ~]$ ls -d dir*
dir1 dir2 dir3
1.2 级联创建:-p 选项(最常用)
如果父目录不存在,mkdir 会报错:
bash
[whisky@centos7 ~]$ mkdir dir1/dir2/dir3/dir4
mkdir: 无法创建目录"dir1/dir2/dir3/dir4": 没有那个文件或目录
使用 -p 选项可以一次性创建整个路径上的所有缺失目录:
bash
[whisky@centos7 ~]$ mkdir -p dir1/dir2/dir3/dir4
[whisky@centos7 ~]$ tree dir1
dir1
└── dir2
└── dir3
└── dir4
3 directories, 0 files
💡 生产环境最佳实践 :在脚本中创建目录时,始终使用
mkdir -p。即使目录已存在,-p也不会报错(幂等操作),这比先用test -d判断再创建要简洁得多。
1.3 设置权限:-m 选项
默认情况下,mkdir 创建目录的权限受 umask 影响(详见后续章节)。如需在创建时指定权限,使用 -m:
bash
# 创建一个权限为 700(仅属主可读写执行)的目录
[whisky@centos7 ~]$ mkdir -m 700 private_dir
[whisky@centos7 ~]$ ls -ld private_dir
drwx------. 2 whisky whisky 6 7月 7 15:35 private_dir
1.4 mkdir 选项速查
| 选项 | 作用 | 示例 |
|---|---|---|
-p |
级联创建父目录 | mkdir -p /a/b/c/d |
-m |
创建时指定权限(八进制) | mkdir -m 755 public |
-v |
显示创建过程(verbose) | mkdir -v newdir |
2. 复制文件与目录:cp
cp(Copy)用于复制文件或目录。Linux 的 cp 有许多细节值得注意。
2.1 复制文件
bash
# 准备实验环境
[whisky@centos7 ~]$ cd lab
[whisky@centos7 lab]$ pwd
/home/whisky/lab
# 复制单个文件到当前目录(. 表示当前目录)
[whisky@centos7 lab]$ cp /etc/hosts .
[whisky@centos7 lab]$ ls
hosts
# 复制并重命名
[whisky@centos7 lab]$ cp /etc/hosts ./hosts.bak
[whisky@centos7 lab]$ ls
hosts hosts.bak
# 复制多个文件,目标必须是已存在的目录
[whisky@centos7 lab]$ cp /etc/passwd /etc/host.conf .
[whisky@centos7 lab]$ ls
host.conf hosts hosts.bak passwd
2.2 复制目录:-r 或 -R 选项
复制目录必须使用递归选项,否则会报错:
bash
# 错误方式(不加 -r)
[whisky@centos7 lab]$ cp /etc/yum .
cp: 略过目录"/etc/yum"
# 正确方式
[whisky@centos7 lab]$ cp -r /etc/yum .
[whisky@centos7 lab]$ ls
host.conf hosts hosts.bak passwd yum
2.3 复制目录时的"覆盖行为"陷阱
当目标目录已存在 时,cp -r 的行为与直觉相反:
bash
# 当前 yum 目录已存在
[whisky@centos7 lab]$ ls yum
fssnap.d pluginconf.d protected.d vars version-groups.conf
# 再次复制 /etc/yum 到 ./yum(目标目录已存在)
[whisky@centos7 lab]$ cp -r /etc/yum ./yum
# 结果:源目录被复制到了 ./yum/yum 下面!
[whisky@centos7 lab]$ ls yum
fssnap.d pluginconf.d protected.d vars version-groups.conf yum
[whisky@centos7 lab]$ ls yum/yum/
fssnap.d pluginconf.d protected.d vars version-groups.conf
⚠️ 常见误区 :很多新手以为"
cp -r /etc/yum ./yum会覆盖当前yum目录的内容"。实际上不会 ------如果目标目录已存在,cp会把源目录作为子目录 复制进去,而不是覆盖。要合并覆盖,需要额外的技巧(如rsync -a)。
2.4 常用选项
bash
# -i:覆盖前询问(安全第一)
[whisky@centos7 lab]$ cp -i /etc/hosts ./hosts
cp:是否覆盖"./hosts"? y
# -f:强制覆盖(不询问)
cp -f /etc/hosts ./hosts
# -p:保留原文件的权限、时间戳等属性
cp -p /etc/hosts ./hosts-p
# -a:归档模式(等于 -dpR),保留所有属性并递归复制目录
# 常用于备份
cp -a /etc/yum ./yum-backup
# -u:仅当源文件比目标文件新时才复制(增量复制)
cp -u /etc/hosts ./hosts
# -v:显示复制过程
cp -v /etc/hosts .
'/etc/hosts' -> './hosts'
2.5 cp 选项速查表
| 选项 | 作用 | 使用场景 |
|---|---|---|
-r / -R |
递归复制目录 | 必加(复制目录时) |
-i |
覆盖前交互确认 | 日常操作,防止误覆盖 |
-f |
强制覆盖,不询问 | 脚本中确定要覆盖 |
-p |
保留属性(权限、时间戳) | 备份时保持原样 |
-a |
归档模式(=-dpR) |
完整备份目录 |
-u |
增量复制(源更新才复制) | 同步更新文件 |
-v |
显示复制过程 | 调试或确认操作 |
2.6 复制文件的标准操作流程
bash
# 安全模式:先确认目标是否存在,用 -i 保护
cp -i source.txt /target/path/
# 批量备份模式:保留所有属性
cp -ap /etc/important/ /backup/important/
3. 移动与重命名:mv
mv(Move)有两个功能:
- 移动文件/目录到另一个位置
- 重命名文件/目录(当目标在同一目录时)
3.1 移动文件
bash
# 准备实验环境:创建目标目录
[whisky@centos7 lab]$ mkdir ../backup
# 移动单个文件到另一个目录
[whisky@centos7 lab]$ mv hosts.bak ../backup/
[whisky@centos7 lab]$ ls ../backup/
hosts.bak
# 移动多个文件,目标必须是已存在的目录
[whisky@centos7 lab]$ mv passwd host.conf ../backup/
[whisky@centos7 lab]$ ls
hosts yum
[whisky@centos7 lab]$ ls ../backup/
host.conf hosts.bak passwd
3.2 重命名(同一目录下移动)
bash
# 重命名文件
[whisky@centos7 lab]$ ls
hosts yum
[whisky@centos7 lab]$ mv hosts hosts.original
[whisky@centos7 lab]$ ls
hosts.original yum
# 重命名目录
[whisky@centos7 lab]$ mv yum yum-backup
[whisky@centos7 lab]$ ls
hosts.original yum-backup
3.3 移动目录
bash
# 移动单个目录到另一个位置
[whisky@centos7 lab]$ mv yum-backup ../backup/
[whisky@centos7 lab]$ ls ../backup/
host.conf hosts.bak passwd yum-backup
# 如果目标目录已存在,mv 的行为与 cp 类似:将源目录作为子目录移入
[whisky@centos7 lab]$ mkdir ../backup/subdir
[whisky@centos7 lab]$ mv ../backup/yum-backup ../backup/subdir/
[whisky@centos7 lab]$ ls ../backup/subdir/
yum-backup
3.4 mv 与 cp 的关键区别
| 操作 | cp(复制) | mv(移动) |
|---|---|---|
| 源文件是否存在 | 保留 | 消失(被移走) |
| 磁盘空间 | 占用双份 | 不额外占用(只是改变目录项) |
| 跨文件系统 | 必须读写数据 | 先复制再删除原文件 |
| 速度 | 慢(取决于数据量) | 快(同一文件系统内只是改指针) |
💡 最佳实践 :在同一磁盘分区内,
mv几乎是瞬间完成的(不移动实际数据,只修改目录项)。而cp要实际读写数据,慢得多。因此,只在"需要保留原件"时用cp,其他情况优先用mv。
3.5 mv 选项速查
| 选项 | 作用 |
|---|---|
-i |
覆盖前询问确认 |
-f |
强制覆盖,不询问 |
-u |
仅当源文件比目标文件新时移动(增量) |
-v |
显示移动过程 |
4. 删除文件与目录:rm 与 rmdir
删除操作在 Linux 中是不可逆的(没有 Windows 的"回收站")。务必谨慎。
4.1 rmdir ------ 只能删除空目录
bash
# 删除空目录
[whisky@centos7 lab]$ mkdir empty_dir
[whisky@centos7 lab]$ rmdir empty_dir
# 尝试删除非空目录会失败
[whisky@centos7 lab]$ rmdir ../backup
rmdir: 删除 "../backup" 失败: 目录非空
rmdir 只对空目录有效,实用性有限。
4.2 rm ------ 通用删除工具
bash
# 删除文件
[whisky@centos7 lab]$ rm hosts.original
# 默认会询问(如果文件有写保护)
rm:是否删除有写保护的普通文件 "hosts.original"?y
# 删除多个文件
[whisky@centos7 lab]$ rm file1 file2 file3
# 强制删除(不询问)
rm -f hosts.original
4.3 删除目录:-r 选项
bash
# 递归删除目录及其所有内容
[whisky@centos7 lab]$ rm -r ../backup/yum-backup
# 强制递归删除(最常见用法)
[whisky@centos7 lab]$ rm -rf ../backup
4.4 ⚠️ rm -rf ------ 双刃剑
rm -rf 是 Linux 中最危险也最常用的组合:
| 组合 | 含义 | 风险等级 |
|---|---|---|
rm file |
删除文件(有确认提示) | 低 |
rm -f file |
强制删除文件(不确认) | 中 |
rm -r dir |
递归删除目录 | 高 |
rm -rf dir |
强制递归删除(不确认) | 极高 |
⚠️ 经典灾难 :
rm -rf /或rm -rf /*会删除整个系统。另一个常见的危险操作是rm -rf $VAR/,如果$VAR变量为空,实际执行的是rm -rf /。
安全操作规范:
- 删除前先用
ls确认要删除的内容 - 使用相对路径而非绝对路径(降低误删风险)
- 重要文件删除前先用
mv移到/tmp暂存,确认无误再删 - 脚本中用
rm -rf前,先检查变量是否为空
bash
# 安全删除示例:先确认路径
[whisky@centos7 lab]$ echo "要删除的目录是: $DIR"
要删除的目录是: /home/whisky/temp
[whisky@centos7 lab]$ rm -rf "$DIR"
4.5 rm 与 rmdir 对比
| 命令 | 适用对象 | 是否可删除非空内容 |
|---|---|---|
rmdir |
目录 | ❌ 必须为空 |
rm |
文件 | N/A |
rm -r |
目录 | ✅ 递归删除所有内容 |
5. 软链接与硬链接:ln
链接(link)是 Linux 文件系统中非常独特的概念。软链接(符号链接) 像 Windows 的"快捷方式",而硬链接则是一个文件有多个"名字"。
5.1 软链接(符号链接)
软链接是一个独立的文件,其内容指向另一个文件的路径。
bash
# 创建软链接:ln -s 目标 链接名
[whisky@centos7 lab]$ ln -s /var/tmp/ mytmp
[whisky@centos7 lab]$ ls -l mytmp
lrwxrwxrwx. 1 whisky whisky 9 7月 7 16:00 mytmp -> /var/tmp/
# 通过软链接访问目标目录
[whisky@centos7 lab]$ ls mytmp/
abrt systemd-private-xxx ...
# 在软链接目录中创建文件,实际存储在目标目录
[whisky@centos7 lab]$ touch mytmp/testfile
[whisky@centos7 lab]$ ls /var/tmp/testfile
/var/tmp/testfile
软链接的特性
| 特性 | 说明 |
|---|---|
| 文件类型 | 独立文件,l 开头 |
| 大小 | 存储的是目标路径的字符数 |
| 权限 | 权限始终为 lrwxrwxrwx,实际权限取决于目标文件 |
| 跨文件系统 | ✅ 可以 |
| 链接目录 | ✅ 可以 |
| 目标删除后 | 链接失效("断链",显示红色闪烁) |
| 相对路径 | 可以用相对路径,但建议用绝对路径 |
💡 最佳实践 :创建软链接时,目标路径尽量使用绝对路径,否则一旦链接文件被移动,相对路径的目标可能找不到了。
bash
# ❌ 不推荐(相对路径)
ln -s ../var/tmp/ mytmp
# ✅ 推荐(绝对路径)
ln -s /var/tmp/ mytmp
错误示范:相对路径的陷阱
bash
[whisky@centos7 lab]$ ln -s . tmp1
[whisky@centos7 lab]$ ls -l tmp1
lrwxrwxrwx. 1 whisky whisky 1 7月 7 16:05 tmp1 -> .
# 此时 tmp1 指向当前目录,ls tmp1 看到的是当前目录的内容
# 但如果把 tmp1 移动到其他地方,它就指向"移动后的目标位置"
# 所以软链接务必谨慎使用相对路径
5.2 硬链接
硬链接不是独立文件,而是同一文件的另一个目录项(文件名)。 多个硬链接指向同一个 inode(数据块)。
bash
# 准备文件
[whisky@centos7 lab]$ cp /etc/hosts ./hosts-1
# 创建硬链接
[whisky@centos7 lab]$ ln hosts-1 hosts-2
# 查看:两个文件大小、权限完全相同,且硬链接数从 1 变为 2
[whisky@centos7 lab]$ ls -l hosts-1 hosts-2
-rw-r--r--. 2 whisky whisky 158 7月 7 16:10 hosts-1
-rw-r--r--. 2 whisky whisky 158 7月 7 16:10 hosts-2
# 查看 inode 号(相同的 inode 说明指向同一数据)
[whisky@centos7 lab]$ ls -i hosts-1 hosts-2
33554556 hosts-1
33554556 hosts-2
验证:修改一个,另一个同步变化
bash
# 修改 hosts-1 内容
[whisky@centos7 lab]$ echo "192.168.1.100 myserver" >> hosts-1
# hosts-2 也同步变化
[whisky@centos7 lab]$ cat hosts-2
127.0.0.1 localhost localhost.localdomain ...
::1 localhost localhost.localdomain ...
192.168.1.100 myserver
硬链接的特性
| 特性 | 说明 |
|---|---|
| 文件类型 | 普通文件(与源文件相同) |
| inode | 与源文件相同 |
| 硬链接数 | 每增加一个硬链接,计数 +1 |
| 跨文件系统 | ❌ 不可以(不同文件系统的 inode 编号不互通) |
| 链接目录 | ❌ 不可以(防止循环引用) |
| 目标删除后 | 数据仍然存在(只要还有一个硬链接) |
| 存储空间 | 不额外占用数据块(只是增加了一个目录项) |
5.3 软链接 vs 硬链接 对比
| 维度 | 软链接(符号链接) | 硬链接 |
|---|---|---|
| 本质 | 独立的文件,指向目标路径 | 同一文件的另一个"名字" |
| inode | 不同 | 相同 |
| 跨文件系统 | ✅ 可以 | ❌ 不可以 |
| 可链接目录 | ✅ 可以 | ❌ 不可以 |
| 源文件删除后 | ❌ 链接失效(断链) | ✅ 数据仍可访问 |
| 占用额外空间 | 极小(存储路径字符串) | 仅增加目录项(约几十字节) |
| 识别方式 | lrwxrwxrwx,有 -> 箭头 |
与普通文件无异,看硬链接数 >1 |
5.4 链接的实际应用场景
| 场景 | 推荐类型 | 原因 |
|---|---|---|
| 快捷访问深层目录 | 软链接 | 例如 ln -s /var/log/nginx ~/nginx-logs |
| 版本切换(如 JDK) | 软链接 | java -> /usr/lib/jvm/java-11/bin/java |
| 共享库版本管理 | 软链接 | libc.so.6 -> libc-2.17.so |
| 同一文件多个备份名 | 硬链接 | 节省空间,任一名称均可访问 |
| 避免误删重要数据 | 硬链接 | 只要还有一个链接,数据就不丢失 |
6. Shell 扩展匹配:通配符的艺术
当你要操作 100 个文件时,逐个输入文件名是极其低效的。Shell 通配符(Globbing) 让你用模式匹配批量选中文件。
6.1 通配符分类速查表
| 模式 | 匹配规则 | 示例 |
|---|---|---|
* |
任意长度(含空)的任意字符 | *.txt 匹配所有 txt 文件 |
? |
单个任意字符 | file-?.txt 匹配 file-1.txt,不匹配 file-10.txt |
[abc] |
括号中的任意一个字符 | file-[abc].txt 匹配 file-a.txt、file-b.txt |
[^abc] 或 [!abc] |
不在括号中的任意字符 | file-[^0-9].txt 匹配不含数字的文件名 |
[0-9] |
范围匹配 | file-[0-9].txt 匹配 file-0 到 file-9 |
{a,b,c} |
花括号展开(不是模式匹配,是字符串展开) | echo {a,b,c}.txt → a.txt b.txt c.txt |
{1..5} |
数字范围展开 | touch file-{1..5}.txt 创建 5 个文件 |
~ |
当前用户家目录 | cd ~/Documents |
~username |
指定用户的家目录 | ls ~root |
6.2 字符类(POSIX 字符集)
| 字符类 | 等价于 | 匹配范围 |
|---|---|---|
[[:alpha:]] |
[a-zA-Z] |
所有字母 |
[[:lower:]] |
[a-z] |
所有小写字母 |
[[:upper:]] |
[A-Z] |
所有大写字母 |
[[:digit:]] |
[0-9] |
所有数字 |
[[:alnum:]] |
[a-zA-Z0-9] |
所有字母和数字 |
[[:space:]] |
空格/制表符/换行等 | 空白字符 |
[[:punct:]] |
.,!?;: 等 |
标点符号(不含空格和字母数字) |
6.3 实战示例
* ------ 匹配任意字符串
bash
# 准备实验文件
[whisky@centos7 lab]$ touch file-1 file-2 file-a file-b file-10
# 匹配所有 file- 开头的文件
[whisky@centos7 lab]$ ls file-*
file-1 file-10 file-2 file-a file-b
# 匹配所有 .txt 文件
[whisky@centos7 lab]$ ls *.txt
# 列出当前目录所有 txt 文件
# 复制 /etc 下所有 hosts 开头的文件到当前目录
[whisky@centos7 lab]$ cp /etc/hosts* .
[whisky@centos7 lab]$ ls hosts*
hosts hosts.allow hosts.deny
? ------ 匹配单个字符
bash
# 匹配 file- 后跟 1 个字符的文件
[whisky@centos7 lab]$ ls file-?
file-1 file-2 file-a file-b
# file-10 不匹配(因为 ? 只能匹配一个字符)
# 匹配 file- 后跟 2 个字符的文件
[whisky@centos7 lab]$ ls file-??
file-10
[] ------ 匹配指定字符集
bash
# 匹配 file- 后跟数字的文件
[whisky@centos7 lab]$ ls file-[0-9]
file-1 file-2
# 匹配 file- 后跟字母 a 或 b 的文件
[whisky@centos7 lab]$ ls file-[ab]
file-a file-b
# 匹配不以数字结尾的文件
[whisky@centos7 lab]$ ls file-[^0-9]
file-a file-b
字符类示例
bash
# 准备更多文件
[whisky@centos7 lab]$ touch file-A file-Z file-z file-9
# 匹配所有数字
[whisky@centos7 lab]$ ls file-[[:digit:]]
file-1 file-2 file-9
# 匹配所有大写字母
[whisky@centos7 lab]$ ls file-[[:upper:]]
file-A file-Z
# 匹配所有字母(大小写)
[whisky@centos7 lab]$ ls file-[[:alpha:]]
file-a file-A file-b file-z file-Z
{} ------ 花括号展开(批量创建/操作)
{} 不是匹配已存在的文件,而是展开生成字符串列表:
bash
# 批量创建文件
[whisky@centos7 lab]$ touch file-{1..6}.txt
[whisky@centos7 lab]$ ls
file-1.txt file-2.txt file-3.txt file-4.txt file-5.txt file-6.txt
# 批量创建目录
[whisky@centos7 lab]$ mkdir -p {Music,Pictures,Videos}/{2024,2025}
[whisky@centos7 lab]$ tree
.
├── Music
│ ├── 2024
│ └── 2025
├── Pictures
│ ├── 2024
│ └── 2025
└── Videos
├── 2024
└── 2025
# 组合使用
[whisky@centos7 lab]$ echo file-{a,b,c}-{1,2}.txt
file-a-1.txt file-a-2.txt file-b-1.txt file-b-2.txt file-c-1.txt file-c-2.txt
⚠️ 重要区别 :
*、?、[]是通配符匹配 ------它们会去匹配实际存在的文件名。{}是字符串展开 ------它不关心文件是否存在,只是按规则生成字符串。所以rm file-{1..100}.txt即使某些文件不存在也不会报错(当然也不会删除不存在的文件)。
6.4 通配符使用场景速查
| 场景 | 通配符写法 | 说明 |
|---|---|---|
删除所有 .log 文件 |
rm *.log |
谨慎操作 |
复制所有以 conf 结尾的文件 |
cp *conf /backup/ |
|
| 查看第 1-9 个文件 | ls file-[1-9] |
注意 [1-9] 不匹配两位数 |
| 批量重命名 | for f in *.txt; do mv "$f" "${f%.txt}.bak"; done |
结合循环 |
| 批量创建 100 个目录 | mkdir dir-{1..100} |
{} 展开 |
| 列出所有隐藏文件 | ls .[!.]* |
不包含 . 和 .. |
7. 总结与速查手册
7.1 核心知识点一览
| 主题 | 关键点 |
|---|---|
| mkdir | -p 级联创建,-m 指定权限 |
| cp | 复制目录必须加 -r,目标目录存在时会作为子目录复制进去 |
| mv | 移动 + 重命名,同一文件系统内极快(只改目录项) |
| rm | 删除不可逆!rm -rf 是双刃剑,慎用 |
| 软链接 | ln -s,指向路径,可跨文件系统,目标删除则失效 |
| 硬链接 | ln,同一 inode 的多个名字,不可跨文件系统,不可链接目录 |
| 通配符 | *(任意)、?(单字符)、[](字符集)、{}(展开) |
7.2 本章命令速查表
| 命令 | 常用形式 | 作用 |
|---|---|---|
mkdir |
mkdir -p /a/b/c |
创建目录(含父目录) |
cp |
cp -r source/ target/ |
递归复制目录 |
mv |
mv file1 file2 |
移动或重命名 |
rm |
rm -rf dir/ |
强制递归删除(⚠️ 慎用) |
rmdir |
rmdir empty_dir/ |
删除空目录 |
ln -s |
ln -s /target link |
创建软链接 |
ln |
ln file1 file2 |
创建硬链接 |
7.3 文件操作对比一览
| 操作 | 单个文件 | 多个文件 | 目录(递归) |
|---|---|---|---|
| 复制 | cp a b |
cp a b c target_dir/ |
cp -r a_dir b_dir |
| 移动 | mv a b |
mv a b c target_dir/ |
mv a_dir b_dir |
| 删除 | rm a |
rm a b c |
rm -r a_dir |
7.4 通配符速查卡
| 模式 | 匹配规则 | 示例匹配 |
|---|---|---|
* |
任意长度(含 0)任意字符 | *.txt → a.txt、b.txt |
? |
恰好 1 个任意字符 | file-?.txt → file-1.txt,不匹配 file-10.txt |
[abc] |
a、b、c 中任意一个 | file-[abc].txt → file-a.txt |
[^abc] |
不是 a、b、c 的任意字符 | file-[^0-9].txt → file-a.txt |
[0-9] |
0~9 任意一个数字 | file-[0-9].txt → file-1.txt |
{a,b,c} |
展开为 a、b、c | echo {a,b}.txt → a.txt b.txt |
{1..5} |
展开为 1~5 | touch file-{1..5}.txt → 创建 5 个文件 |
7.5 软链接与硬链接速查表
| 维度 | 软链接 | 硬链接 |
|---|---|---|
| 创建命令 | ln -s |
ln |
| 文件类型 | l(独立文件) |
-(普通文件) |
| inode | 不同 | 相同 |
| 跨文件系统 | ✅ | ❌ |
| 链接目录 | ✅ | ❌ |
| 源删除后 | 失效(断链) | 仍然有效 |
| 占用额外空间 | 路径字符串大小 | 仅目录项 |
7.6 常见错误排查指南
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
cp: 略过目录"xxx" |
复制目录未加 -r |
加 -r 选项 |
rmdir: 删除失败: 目录非空 |
目录中有文件/子目录 | 用 rm -r 代替 |
ln: 无法创建硬链接: 无效的跨设备链接 |
硬链接跨文件系统 | 用软链接代替 |
ls: 无法访问: 没有那个文件或目录 |
通配符没有匹配到任何文件 | 检查通配符语法是否正确 |
执行 rm -rf $VAR/ 删除了整个系统 |
$VAR 变量为空 |
删除前先检查变量:echo "删除路径: $VAR" |
7.7 思考与拓展(原课后作业转化)
cp -r和cp -a有什么区别?
→-a(archive)等于-dR --preserve=all,会保留权限、时间戳、所有者、硬链接关系等所有元数据;-r只做递归复制,不保留这些属性。备份场景优先用-a。- 为什么
rm删除的文件无法恢复?
→rm只是删除了文件名与 inode 的关联,并标记数据块为"空闲"。除非立即用专业工具扫描,否则数据块可能被新文件覆盖。Linux 没有"回收站"机制。 - 硬链接数的含义是什么?
→ 硬链接数表示"有多少个目录项指向同一个 inode"。创建新目录时,硬链接数会包含.和..。例如一个新空目录的硬链接数为 2(dir/自身 +dir/.)。 - 什么时候用软链接,什么时候用硬链接?
→ 链接目录用软链接;跨文件系统用软链接;想节省空间且同一文件系统内用硬链接;想让文件"防误删"用硬链接。 rm -rf \*和rm -rf \* .\*有什么区别?
→rm -rf *只删除非隐藏文件;rm -rf * .*会匹配.和..,导致当前目录和父目录也被删除------极其危险,永远不要执行!
7.8 生产环境最佳实践
| 场景 | 建议 |
|---|---|
| 日常删除 | 先 ls 确认再 rm,或者先 mv 到 /tmp 暂存 |
| 批量操作 | 先用 echo 测试通配符是否匹配正确,再执行实际命令 |
脚本中的 rm -rf |
执行前必须检查变量非空:[ -n "$DIR" ] && rm -rf "$DIR" |
| 备份文件 | 用 cp -a 保留完整属性 |
| 跨文件系统移动大文件 | 用 rsync -av --remove-source-files 代替 mv,支持断点续传 |
| 创建软链接 | 目标路径使用绝对路径,避免链接文件移动后失效 |
下期预告 :你已经能在 Linux 文件系统中自由"行走"和"整理"了,但遇到不会用的命令怎么办?下一期我们将学习 Linux 的"自学指南"------获取帮助 。从 man 手册的章节划分,到 --help 选项,再到 /usr/share/doc 下的文档和 which/whereis 查找工具,你将掌握"永远不再依赖搜索引擎"的自学方法论。同时我们还会进入 vim 编辑器的世界------它可能是学习曲线最陡但回报最高的工具。敬请期待第五期!
--- Compiled and Authored by Whisky --- July 7 th, 2026