打包压缩与软硬链接
打包压缩&&软硬链接
[TOC]
概述
为什么要压缩?
-
大的文件压缩后变小
-
节省磁盘空间
-
节省网络带宽
-
减少磁盘IO、输入输出、大量的读写操作
-
打包压缩过程占用本地服务器CPU
- 在CPU==使用率低==的时间段进行打包
- ⚠️ 不要轻易的打包,因为太占用CPU使用率了
- ⚠️ 你CPU使用率上来了,负载也就高了
- 在CPU==使用率低==的时间段进行打包

tar压缩
📌 tar 常用选项速查:
| 选项 | 含义 |
|---|---|
z | 使用 gzip 进行压缩 |
c | 创建压缩文件 |
v | 显示压缩过程 |
f | 指定文件 |
t | 查看压缩包内容(常与 f 连用:tf) |
C | 大写,指定解压位置 |
p | 小写,保留权限 |
x | 解压 |
--exclude | 排除某个文件(打包压缩时常用) |
💡 如果它是.tar.gz包你去解压,为了兼容旧系统==尽量==明确指定使用 -z
-xf也能自动识别 gzip 压缩的 tar 包,并正确解压- 但某些旧版或精简版 tar 不支持自动检测,必须显式指定
-z
- 但某些旧版或精简版 tar 不支持自动检测,必须显式指定
tar -zcf:将文件/目录打包 并用 gzip 压缩,生成 .tar.gz 文件- ✅ gzip 压缩,文件较小
tar -cf:将文件/目录打包成一个 .tar 文件(仅打包,不压缩)- ❌ 仅打包, 文件较大
⚠️ 关键:f 选项常常放在后面,f 后面要跟 .tar.gz 压缩包,不能被其他选项隔开!
❌️ 错误示例:-zcfp 会创建出一个以 p 命名的文件!
✅️ 正确示例:-zcfp 中 f 后面立即跟压缩包路径[root@R11 sh]# tar -zcpf /data/all.tar.gz /var/log >/dev/null[root@R11 sh]# ll /data-rw-r--r-- 1 root root 97787 Mar 14 11:52 all.tar.gztar语法结构:
tar 参数选项 压缩包名称.tar.gz file1 file2# ✅筐子 香蕉 黄瓜 茄子'我们这里是需要先找个框子,再去把水果装进里面'📌 '换句话说,就是压缩包在前面'🌰 案例:压缩多个文件 a.txt 和 b.txt 为 all.tar.gz
[root@oldboyedu ~]# tar zcvf all.tar.gz a.txt b.txta.txtb.txt'空格进行隔开即可'
[root@oldboyedu ~]# lltotal 12-rw-r--r-- 1 root root 117 Nov 6 09:22 all.tar.gz⚠️ 案例:打包不同路径下的文件 /etc/hosts
绝对路径压缩 /根下文件
李四: 它的
/etc/hosts中百度对应的域名为11.22.33.44张三: 它的
/etc/hosts中百度对应的域名为10.0.0.200我们分两种情况来讨论:
- 压缩包里面为
/etc/hosts→ 张三解压后,自己本地的/etc/hosts直接被覆盖了- 压缩包里面为
etc/hosts→ 张三在/root家目录中解压后,当前目录出现解压后的etc/hosts文件✅️ 很明显第二种方式更加的安全。而我们系统压缩时就是会默认去除
/
[root@oldboyedu ~]# tar zcvf h.tar.gz /etc/hoststar: Removing leading `/' from member names/etc/hosts'系统为了安全、默认将 / 移除'
[root@oldboyedu ~]# tar tf h.tar.gzetc/hosts'查看压缩包中的内容,/ 已经被删除了'相对路径压缩根下文件
🌰 案例:进入到相对路径压缩 /etc/hosts 和 /etc/passwd
✅ 推荐使用相对路径压缩,先进入到对应的目录下
[root@oldboyedu ~]# cd /etc/[root@oldboyedu etc]# ll hosts passwd-rw-r--r-- 1 root root 194 Oct 31 09:28 hosts-rw-r--r-- 1 root root 1882 Oct 24 23:30 passwd
[root@oldboyedu etc]# tar zcvf a.tar.gz hosts passwdhostspasswd'两个文件都压缩进去了'[root@oldboyedu etc]# ll a.tar.gz-rw-r--r-- 1 root root 986 Nov 6 09:29 a.tar.gz
[root@oldboyedu etc]# tar tf a.tar.gzhostspasswd# 查看压缩的两个文件'相对路径的好处是,前面不会跟路径,只有文件名'🌰 案例:打包当前的 a.txt 将压缩包放到 /opt 目录
- 先进入到要打包压缩文件的路径下,把这些文件压缩到指定目录下
✅ 压缩包名前可以直接加路径 📌
[root@oldboyedu ~]# rm -rf /opt/*[root@oldboyedu ~]# ll /opt/total 0
[root@oldboyedu ~]# tar zcvf /opt/a.tar.gz a.txta.txt'把当前目录下的 a.txt 直接压缩到 /opt/ 目录下'
[root@oldboyedu ~]# ll /opt/total 4-rw-r--r-- 1 root root 108 Nov 6 09:33 a.tar.gz—exclude
📌 排除打包压缩
[root@oldboyedu ~]# touch {1..3}.txt[root@oldboyedu ~]# lltotal 0-rw-r--r-- 1 root root 0 Nov 6 10:09 1.txt-rw-r--r-- 1 root root 0 Nov 6 10:09 2.txt-rw-r--r-- 1 root root 0 Nov 6 10:09 3.txt
[root@oldboyedu ~]# tar zcvf a.tar.gz --exclude=1.txt ./*./2.txt./3.txt# 排除 1.txt,其他文件都打包压缩
[root@oldboyedu ~]# tar tf a.tar.gz./2.txt./3.txt# 用 tf 验证一下🌰 排除 *.txt 的文件
✅ 支持通配符
[root@oldboyedu ~]# lltotal 0-rw-r--r-- 1 root root 0 Nov 6 10:10 1.log-rw-r--r-- 1 root root 0 Nov 6 10:09 1.txt-rw-r--r-- 1 root root 0 Nov 6 10:10 2.log-rw-r--r-- 1 root root 0 Nov 6 10:09 2.txt-rw-r--r-- 1 root root 0 Nov 6 10:09 3.txt# 既有 txt 结尾的,也有 log 结尾的
[root@shell ~]# tar zcf /tmp/all.tar.gz --exclude=*.txt ./*[root@shell ~]# tar tf /tmp/all.tar.gz./1.log./2.log# 排除 .txt 文件,只压缩 .log 文件tar解压:
📌 解压常见形式:
tar -xvf a.tar— 默认解压到当前路径下tar -zxf /opt/hh.tar.gz -C /home/— 使用-C指定解压目录,使用绝对路径找/opt/下的压缩包
🌰 案例:默认解压到当前路径
[root@oldboy home]# lltotal 4-rw-r--r-- 1 root root 120 Dec 10 19:06 hh.tar.gz# 只有一个 tar.gz 压缩包
[root@oldboy home]# tar tf hh.tar.gza.txtb.txt# 先 tf 查看一下大概的内容
[root@oldboy home]# tar -zxvf hh.tar.gza.txtb.txt# -v 显示解压过程
[root@oldboy home]# lltotal 4-rw-r--r-- 1 root root 0 Dec 10 19:05 a.txt-rw-r--r-- 1 root root 0 Dec 10 19:06 b.txt-rw-r--r-- 1 root root 120 Dec 10 19:06 hh.tar.gz# 默认在当前目录解压, 全部都解压出来了-C
🌰 案例:指定解压到 /opt 目录
[root@oldboy home]# cd ~'切换至 /root/ 目录下'
[root@oldboy ~]# ll /opt/total 4-rw-r--r-- 1 root root 120 Dec 10 19:06 hh.tar.gz# /opt/ 下有一个压缩包
[root@oldboy ~]# pwd/root# 当前路径
[root@oldboy ~]# tar -zxf /opt/hh.tar.gz -C /home# -C 指定解压至 /home 目录下# 使用绝对路径找 /opt/ 下的压缩包
[root@oldboy ~]# ll /hometotal 0-rw-r--r-- 1 root root 0 Dec 10 19:05 a.txt-rw-r--r-- 1 root root 0 Dec 10 19:06 b.txt'都解压成功了'zip压缩:
zip a.zip '文件'把要压缩的文件放后面,得先需要一个筐子,再把文件放里面
🌰 案例:打包 a.txt 为 a.zip
[root@oldboyedu ~]# zip a.zip a.txt adding: a.txt (stored 0%)
[root@oldboyedu ~]# lltotal 4-rw-r--r-- 1 root root 0 Nov 6 10:14 a.txt-rw-r--r-- 1 root root 160 Nov 6 10:14 a.zip🌰 案例:打包不同路径的文件
[root@oldboyedu ~]# zip /opt/all.zip /etc/hosts a.txt'打包压缩存放到指定路径 /opt/all.zip'# 两个文件,空格隔开即可 adding: etc/hosts (deflated 56%)# 这里包含 / 根,所以默认把它去了 → etc/hosts adding: a.txt (stored 0%)
[root@oldboyedu ~]# ll /opt/total 4-rw-r--r-- 1 root root 1424 Nov 6 10:17 all.zipunzip解压缩
unzip /tmp/a.zip# 默认解压在当前路径-d
🌰 案例:解压到指定路径
[root@oldboyedu ~]# unzip ./a.zip -d /opt/Archive: a.zip extracting: /opt/a.txt
[root@oldboyedu ~]# ll /opt/total 0-rw-r--r-- 1 root root 0 Nov 6 10:14 a.txt文件权限
可以看到我们整个Linux中,权限只有三部分:可读,可写,可执行
在Linux中,所属用户组没什么意义,我们基本不动属组,我们动的最多的就是属主,主人对它有什么权限,那么这个文件就拥有什么权限
因为所属组和其他用户,往往权限一样,都是只读,只能看
image-20260625194249056 在Linux系统中创建一个用户,对应默认创建一个组,组的名称是以用户名命名的
- 比如创建了一个用户为 oldboy,系统会自动创建 oldboy 命名的一个小组
- 这个小组中只有一个用户,就是 oldboy
所以我们规范一点的创建用户流程就是: ① 创建属组,并指定组ID ② 创建用户,并指定它的用户ID和组ID
67451445 -rw-r--r-- 1 root root 308 Nov 6 10:26 a.txt
# 文件类型:- # 普通文件d # 目录l # 软链接b # 块设备c # 字节设备# 详细的信息,请看相关笔记
# 9位权限位,三位为一组:r # 表示读 readw # 表示写 write- # 表示没有权限x # 表示可执行
✅ x 对于'文件'来说, 只有脚本才用到✅ x 对于'文件夹'来说,有 x 权限,说明能够 cd 进入到里面
# 数字权限:r: 4 w: 2 x: 1硬链接
什么是硬链接?
🔹 相同的 inode 号码互为硬链接
🔹 多个名字代表同一个实体
🔹 类似超市多个门
这两个文件名不一样,但是呢他们的 inode 号码一样的
所以呢他们指向同一个 block 块,指向同一个数据
⚠️ 当我们数据丢失的时候,就不能进行大量的写入操作了,你写入的操作越多,被覆盖的可能性就越大,找回的数据就越少

- 两个硬链接 a.txt 和 b.txt 内容完全一样,它俩操作的是同一个 block 块
- 删除 a.txt 后:
- a.txt 这个文件名消失了,硬链接数由 2 变为 1
- b.txt 的 inode 号没有被删除,仍然可以继续通过 b.txt 访问到原 block 里面的内容
- 如果硬链接个数为 0,文件没了
硬链接的特点???
🔹 硬链接可以防止误删
❌️ 为什么说”硬链接可以做备份”不准确?
- 硬链接不是独立副本
- 它和原文件完全共享数据
- 修改任何一个硬链接,其他所有硬链接看到的内容都会同步改变
- 无法防止内容损坏或覆盖
- 如果你误操作把文件内容清空, 所有硬链接都会立即变成空文件
🔹 创建硬链接几乎不消耗额外磁盘空间,也不会消耗新的 inode 号
🔹 但在用 ls -lh 查看时,会显示源文件实际数据大小
🔹 文件默认1个硬链接、目录默认2个硬链接(目录项本身、该目录内部名为 . 的特殊条目)
🔹 修改任意文件,其他都变化
🔹 删除一个硬链接文件不影响另一个文件
🔹 目录不能创建硬链接
🔹 文件和目录都可以创建软链接
🔹 硬链接不能跨文件系统(不能跨磁盘)
在 Linux 中,不同磁盘(或文件系统)之间可以有相同的 inode 号
inode 号是在单个文件系统(filesystem)内部唯一的
每个文件系统(例如 /dev/sda1、/dev/sdb1 等)都有自己的 inode 表
不同文件系统之间的 inode 号可以重复
/dev/sda1 和 /dev/sda2 不是同一个文件系统
详细解释:
/dev/sda表示第一块 SATA(或 SCSI、NVMe 等)硬盘/dev/sda1是这块硬盘上的第一个分区/dev/sda2是这块硬盘上的第二个分区- 每个分区(如 sda1、sda2)在 Linux 中被视为独立的块设备
创建硬链接
ln 源文件 链接文件# 后面那个才是我们链接的文件[root@oldboyedu ~]# ln a.txt b.txt# b.txt 为创建的硬链接
[root@oldboyedu ~]# lltotal 8-rw-r--r-- 2 root root 9 Nov 6 10:55 a.txt-rw-r--r-- 2 root root 9 Nov 6 10:55 b.txt# 创建完成后,硬链接数变为 2
[root@oldboyedu ~]# ln b.txt /opt/c.txt# 再创建一个硬链接,至 /opt/c.txt
[root@oldboyedu ~]# lltotal 8-rw-r--r-- 3 root root 9 Nov 6 10:55 a.txt-rw-r--r-- 3 root root 9 Nov 6 10:55 b.txt# 硬链接数变为 3🌰 案例:经常改动一个文件,将系统文件做一个硬链接到 /opt 下
ln /etc/hosts /opt/hosts# 防止误删find -inum
📌 find 按照 inode 号查找
[root@oldboy home]# ll -i a.txt34139649 -rw-r--r-- 1 root root 0 Dec 10 19:05 a.txt# 文件默认有 1 个硬链接
[root@oldboy home]# find / -type f -inum 34139649/home/a.txt# 从 / 根找 inode 号为 34139649 的文件目录硬链接
-
目录==不能==创建硬链接
-
目录默认有两个硬链接
- 目录项本身、该目录内部名为
.的特殊条目
- 目录项本身、该目录内部名为
[root@oldboyedu ~]# ll -id oldboy/101679022 drwxr-xr-x 2 root root 19 Nov 6 11:30 oldboy/# -id 查看目录本身的 inode 号
[root@oldboyedu ~]# ll -ai oldboy/total 4101679022 drwxr-xr-x 2 root root 19 Nov 6 11:30 .# 这个 . 点就表示 oldboy 目录,也就是当前目录67157057 dr-xr-x--- 6 root root 199 Nov 6 11:29 ..# 上一级目录的入口,也就是和上一级目录的 inode 号一样'换句话说,oldboy 目录下的 .. 是上一级目录的硬链接'我们来验证一下
[root@oldboy home]# rm -rf ./*[root@oldboy home]# lltotal 0# 现在当前目录下什么都没有
[root@oldboy home]# mkdir oldboy[root@oldboy home]# ll -id oldboy/868700 drwxr-xr-x 2 root root 6 Dec 11 16:21 oldboy/# 默认硬链接数是 2
[root@oldboy home]# mkdir -p oldboy/test/# 我们给它创建了一个子目录 test
[root@oldboy home]# ll -id oldboy/868700 drwxr-xr-x 3 root root 18 Dec 11 16:21 oldboy/# 再次查看硬链接数变为了 3
[root@oldboy home]# ll -ai oldboy/total 0 868700 drwxr-xr-x 3 root root 18 Dec 11 16:21 .# 这个 . 点就是当前目录 oldboy,也就是它的硬链接33569282 drwxr-xr-x 3 root root 20 Dec 11 16:21 ..34138933 drwxr-xr-x 2 root root 6 Dec 11 16:21 test
[root@oldboy home]# ll -ai oldboy/test/total 034138933 drwxr-xr-x 2 root root 6 Dec 11 16:21 . 868700 drwxr-xr-x 3 root root 18 Dec 11 16:21 ..# 当前目录为 test, cd .. 能返回到上级目录 oldboy# oldboy/test/.. 就是 oldboy 的硬链接软链接
📌 特点: 类似 Windows 的快捷方式、里面存储指向源文件的路径
🔹 inode 号码不同
🔹 软链接占一点数据空间(存目标路径字符串)
🔹 强依赖:原文件被移动、重命名或删除,软连接就会变成”悬空链接”
🔹 不显示实际文件大小
[root@Kylin opt]# ln -s /home/oldboy/a.txt /opt/hh.txt# 快捷方式[root@Kylin opt]# ls -lh /home/oldboy/a.txt-rw-r--r-- 1 root root ~1000M~ Dec 11 17:50 /home/oldboy/a.txt'源文件1000M'[root@Kylin opt]# ls -lh /opt/hh.txtlrwxrwxrwx 1 root root ~18~ Dec 11 17:52 /opt/hh.txt -> /home/oldboy/a.txt'18字节'🔹 文件和目录都可以做软链接
🔹 两个文件都可以写入,可查看,本质上是写入到源文件的 block 块
🔹 可以跨文件系统
🔹 创建链接时,建议使用绝对路径
🔹 删除源文件影响链接文件 — 指路牌(软连接)还在,但指向的宝藏(源文件)没了,路就断了
🔹 当我们把源文件重新创建出来(路径,名称不变),依旧能够访问到
🔹 原因:软链接存放着源文件的路径
🔹 删除链接文件不影响源文件 — 虽然指路牌(软连接)没了,但是宝藏(源文件)还在
🔹 硬链接同理,也不影响源文件
创建软链接:
ln -s 源文件 链接文件[root@oldboyedu ~]# ln -s a.txt b.txt# b.txt 为链接文件也就是快捷方式、a.txt 才是源文件
[root@oldboyedu ~]# lllrwxrwxrwx 1 root root 5 Nov 6 11:41 b.txt -> a.txt
[root@oldboyedu ~]# ll -itotal 0 67157818 -rw-r--r-- 1 root root 0 Nov 6 11:40 a.txt 67161321 lrwxrwxrwx 1 root root 5 Nov 6 11:41 b.txt -> a.txt# inode 号并不一样🌰 两个文件都可以写入,查看
[root@oldboyedu ~]# echo aaa > a.txt
[root@oldboyedu ~]# cat b.txtaaa# 通过软链接看到源文件内容
[root@oldboyedu ~]# echo bbb >> b.txt
[root@oldboyedu ~]# cat b.txtaaabbb
[root@oldboyedu ~]# cat a.txtaaabbb# 写入 b.txt 实际上也是写入 a.txt- 软链接依赖源文件存在:
- 源文件改名/删除 → 链接失效
- 源文件恢复同名 → 链接恢复可用
- 重新创建同名文件后,软链接自动“复活”指向新文件(因路径匹配)
- 软链接存储的是路径字符串
[root@oldboy home]# ll -ihtotal 034138933 -rw-r--r-- 1 root root 0 Dec 11 16:43 a.txt34139649 lrwxrwxrwx 1 root root 5 Dec 11 16:44 b.txt -> a.txt[root@oldboy home]# echo fasdf >> a.txt# 往源文件追加内容[root@oldboy home]# cat a.txtfasdf[root@oldboy home]# cat b.txtfasdf'源文件和快捷方式都能看'[root@oldboy home]# ll -ihtotal 4.0K34138933 -rw-r--r-- 1 root root 6 Dec 11 16:44 a.txt34139649 lrwxrwxrwx 1 root root 5 Dec 11 16:44 b.txt -> a.txt✅ inode号不一样✅ l打头:软链接(权限固定l777)[root@oldboy home]# mv a.txt hhh.txt⚠️ 源文件改名[root@oldboy home]# ll -ihtotal 4.0K34139649 lrwxrwxrwx 1 root root 5 Dec 11 16:44 b.txt -> a.txt34138933 -rw-r--r-- 1 root root 6 Dec 11 16:44 hhh.txt[root@oldboy home]# cat b.txtcat: b.txt: No such file or directory❌ '快捷方式无法访问'[root@oldboy home]# mv hhh.txt a.txt✅ 重新改回来,又能查看了[root@oldboy home]# cat b.txtfasdf[root@oldboy home]# rm -rf a.txt# 删除源文件[root@oldboy home]# cat b.txtcat: b.txt: No such file or directory# 软链接文件失效📌 当我们把源文件重新创建出来(路径,名称不变)依旧能够访问到[root@oldboy home]# echo "这是新的a.txt文件" > a.txt# a.txt重新创建出来[root@oldboy home]# cat b.txt这是新的a.txt文件# 查看快捷方式,又有了目录软链接
🌰 给 /home/oldboy 目录, 在 /opt 下创建一个快捷方式
✅ 访问 /opt/test 实际访问的是 /home/oldboy 目录
ln -s /home/oldboy/ /opt/test# 创建链接时,建议使用绝对路径'相对路径易出错,绝对路径更可靠'
[root@oldboy home]# lltotal 0drwxr-xr-x 2 root root 6 Dec 11 17:17 oldboy# 在/home/下创建目录[root@oldboy home]# ln -s oldboy/ /opt/test'相对路径创建软链接'[root@oldboy home]# ll /opt/total 0lrwxrwxrwx 1 root root 7 Dec 11 17:17 test -> oldboy/# test -> ./oldboy/⚠️ 当前目录/opt下压根没有这个目录 → 自然访问不到[root@oldboy home]# cd /opt/test-bash: cd: /opt/test: No such file or directory[root@oldboy home]# rm -rf /opt/test=====================================[root@oldboy home]# ln -s /home/oldboy/ /opt/test✅ 使用绝对路径创建链接
[root@oldboy home]# ll /opt/total 0lrwxrwxrwx 1 root root 13 Dec 11 17:19 test -> /home/oldboy/# 有了绝对的位置 → 我们系统也能够找到[root@oldboy home]# cd /opt/test[root@oldboy test]# pwd/opt/test[root@oldboy test]# echo hhh > a.txt# 创建文件,test下能看见[root@oldboy test]# lltotal 4-rw-r--r-- 1 root root 4 Dec 11 17:20 a.txt[root@oldboy test]# ll /home/oldboy/total 4-rw-r--r-- 1 root root 4 Dec 11 17:20 a.txt# /home/oldboy/也能看见'本质写入到这里面去了'版本升级
- 用户一直访问的都是
game目录 - 是从不同的版本软链接到
game目录下 - 如果 v1.2 版本崩了,删除
game快捷方式,重新把 v1.1 软链接过去即可 - ✅️ 保留版本号(源文件名不动),软链接至一个更加简短的文件名中
💡 硬链接不能链接目录,也不能跨文件系统,所以我们选择软链接!
面试题
软链接和硬链接的区别? — inode号 / 磁盘空间 / 创建方式 / 删除
🔹 硬链接 inode 相同
🔹 软连接 inode 不同
🔹 硬链接几乎不占用磁盘空间,但显示实际文件大小
🔹 软链接存目标文件路径,不显示实际文件大小
🔹 目录不能创建硬链接
🔹 文件和目录都可以创建软链接
🔹 硬链接不能跨文件系统
🔹 软链接可以跨文件系统
🔹 创建方式不同:硬链接 ln,软链接 ln -s
🔹 删除硬链接和软链接都不影响源文件
🔹 删除源文件不影响硬链接
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!





