1.文件压缩
1.1 什么是文件压缩?
较大的文件经压缩后, 产生了另一个较小容量的文件, 这个文件称为压缩文件
而压缩此文件的过程称为文件压缩.
1.2 为什么要对文件进行压缩?
当我们在传输大量的文件时, 通常都会选择将该文件进行压缩, 然后在进行传输.
首先:压缩后的文件会比压缩前的文件小, 一个28G的文件夹压缩后能达到6G.
其次:多个文件传输很慢, 但单个文件传输会很快, 同时还能节省网络的消耗.
* 每复制一个文件都需要建立一个目录, 这个过程慢.
复制一个大的文件只需要建立一个目录.
文件小而多, 则需要建立的目录多...
1.3 压缩包的互通
windows 接触最多的压缩格式是 rar 或 zip
Linux 使用最多的压缩格式是 zip 和 tar.gz
Linux上的压缩格式放在windows系统下都是可以正常打开的.
Windows和Linux互通通常选择 zip.
Linux不支持 Windows下的 RAR 格式的压缩文件.
2. Linux常见压缩包类型
格式 | 压缩工具 |
---|---|
.zip | zip压缩工具 |
.gz | gzip压缩工具,只能压缩文件,会删除原文件(通常配合tar使用) |
.bz2 | bzip2压缩工具,只能压缩文件,会删除原文件(通常配合tar使用) |
.tar.gz | 先使用tar命令归档打包,然后使用gzip压缩 |
.tar.bz2 | 先使用tar命令归档打包,然后使用bzip压缩 |
3. zip打包与压缩
zip命令可以对文件进行压缩打包.
压缩文件命令: zip 压缩表名 压缩的文件
解压文件命令: unzip 压缩的文件
* 默认情况下没有zip和unzip工具, 需要进行安装: yum install zip unzip -y
3.1 仅压缩目录
# 创建目录
[root@kid ~]# mkdir dir
# 在目录下创建文件
[root@kid ~]# touch dir/1.txt
# 压缩文件为zip包 (不加-r参数, 只会打包一个空目录, 不会打包文件)
[root@kid ~]# zip dir.zip dir
# 只是单独的压缩目录
adding: dir/ (stored 0%)
# 删除创建的目录和文件
[root@kid ~]# rm -rf dir
# 对压缩包解压
[root@kid ~]# unzip dir.zip
Archive: dir.zip
creating: dir/
# dir下没有文件
[root@kid ~]# ll dir
total 0
3.2 压缩目录与文件
# 创建目录
[root@kid ~]# mkdir dir2
# 在目录下创建文件
[root@kid ~]# touch dir2/2.txt
# 使用 -r 参数
[root@kid ~]# zip -r dir2.zip dir2
adding: dir2/ (stored 0%)
# 压缩包含文件
adding: dir2/2.txt (stored 0%)
# 删除之前的目录
[root@kid ~]# rm -rf dir2
[root@kid ~]# unzip dir2
Archive: dir2.zip
creating: dir2/
extracting: dir2/2.txt
# 解压查看目录的内容
[root@kid ~]# ll dir2
total 0
-rw-r--r--. 1 root root 0 Sep 4 17:34 2.txt
3.3 检测压缩包的完整性
# 查看zip压缩包是否是完整的
[root@kid ~]# zip -T dir2.zip
test of dir2.zip OK
3.4 压缩不同目录的文件
# 打包不同目录下的不通文件
[root@kid ~]# touch file1 file2 /etc/file3
[root@kid ~]# zip file.zip file1 file2 /etc/file3
adding: file1 (stored 0%)
adding: file2 (stored 0%)
adding: etc/file3 (stored 0%)
3.5 不解压查看内容
# 不解压压缩查看压缩包中的内容
[root@kid ~]# unzip -l dir2.zip
Archive: dir2.zip
Length Date Time Name
--------- ---------- ----- ----
0 09-04-2022 17:27 dir/
0 09-04-2022 17:34 dir2/
0 09-04-2022 17:34 dir2/2.txt
--------- -------
0 3 files
[root@kid ~]# unzip -t dir2.zip
Archive: dir2.zip
testing: dir/ OK
testing: dir2/ OK
testing: dir2/2.txt OK
No errors detected in compressed data of dir2.zip.
# 在dir2.zip的压缩数据中未检测到错误。
3.6 解压位置
解压zip文件包, 默认解压至当前目录, 也可以通过 -d参数指定解压的路径.
# 默认解压路径为当前目录
[root@lqz ~]# unzip dir2.zip
Archive: dir2.zip
# 加压文件时, 文件以存在, replace dir2/2.txt? 是 不 所有 一个 重命名 :(待输入)
replace dir2/2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
# 解压zip内容至指定目录
[root@kid ~]# unzip dir2.zip -d /opt/
Archive: dir2.zip
creating: /opt/dir/
creating: /opt/dir2/
extracting: /opt/dir2/2.txt
4. gzip打包与压缩
gzip只对文件进行压缩, 对目录无效. 压缩包名 = 压缩文件名+.gz
压缩文件后对源文件删除, 解压后对压缩包进行删除.
gzip安装命令: yum install gzip -y
压缩文件: gzip 文件名
压缩包加油: gzip -d 压缩包名
查看压缩包: zcat 压缩包名
# 创建文件
[root@kid ~]# echo '123' > a.txt
[root@kid ~]# ll
total 4
-rw-r--r--. 1 root root 4 Sep 4 17:58 a.txt
# 压缩文件
[root@kid ~]# gzip a.txt
# 压缩文件被删除
[root@kid ~]# ll
total 4
-rw-r--r--. 1 root root 20 Sep 4 17:58 a.txt.gz
# 不解压查看文件信息
[root@kid ~]# zcat a.txt.gz
123
# 解压
[root@kid ~]# gzip -d a.txt.gz
# 压缩包被删除
[root@kid ~]# ll
total 4
-rw-r--r--. 1 root root 4 Sep 4 17:58 a.txt
# 使用场景:当需要让某个文件不生效时, 快速关闭和启用配置文件
# 将yum源配置全部打包
[root@kid ~]# cd /etc/yum.repos.d/
[root@lqz ~]# gzip *
5. tar打包与压缩
5.1 tar介绍
tar是linux下最常用的压缩与解压缩, 支持文件和目录的压缩归档.
压缩语法:tar [选项] 压缩文件名 压缩的文件路径
解压语法: tar [选项] 压缩文件名 (默认解压到当前目录)
选项:
c 创建新的归档文件
x 对归档文件解包
t 列出归档文件里的文件列表
v 输出命令的归档或解包的过程
f 指定包文件名,多参数f写最后
z 使用gzip压缩归档后的文件(.tar.gz)
j 使用bzip2压缩归档后的文件(.tar.bz2)
J 使用xz压缩归档后的文件(tar.xz)
C 指定解压目录位置
X 排除多个文件(写入需要排除的文件名称)
h 打包软链接指向的源文件
--hard-dereference 打包硬链接
--exclude 在打包的时候写入需要排除文件或目录
5.2 常用打包与压缩组合
常用打包组合:
czvf 打包tar.gz格式 常用
cjvf 打包tar.bz格式 不怎么用
cJf 打包tar.xz格式 不考虑
常用压缩组合:
zxvf 解压tar.gz格式
jxvf 解压tar.bz格式
xf 自动选择解压模式
xvf 显示解压过程
tf 查看压缩包内容
5.3 tar.gz压缩文件
* 需要下下载gzip: yum -y install gzip
# 创建目录
[root@kid ~]# mkdir dir1 dir2
[root@kid ~]# ll
total 0
drwxr-xr-x. 2 root root 6 Sep 4 18:17 dir1
drwxr-xr-x. 2 root root 6 Sep 4 18:17 dir2
# 压缩文件
[root@kid ~]# tar czvf dir.tar.gz dir1 dir2
dir1/
dir2/
[root@kid ~]# ll
total 4
drwxr-xr-x. 2 root root 6 Sep 4 18:17 dir1
drwxr-xr-x. 2 root root 6 Sep 4 18:17 dir2
-rw-r--r--. 1 root root 119 Sep 4 18:18 dir.tar.gz
5.4 tar.bz2方式压缩文件
* 需要下下载bzip2: yum -y install bzip2
否则会报错:
tar: dir.txt: Cannot stat: No such file or directory
tar (child): bzip2: Cannot exec: No such file or directory
[root@kid ~]# mkdir dir1 dir2
[root@kid ~]# tar cjvf dir.tar.bz2 dir1 dir2
dir1/
dir2/
5.5 压缩链接文件的源文件
# 使用h参数 打包链接文件指向的真实文件
[root@kid ~]# tar czfh local.tar.gz /etc/rc.local
# tar:从成员名称中删除前导“/” 详情见5.11
tar: Removing leading `/' from member names
# 需要切换到根目录下 在压缩
[root@lqz ~]# cd /
[root@lqz /]# tar czfh local.tar.gz /etc/rc.local
[root@kid /]# ll local.tar.gz
-rw-r--r--. 1 root root 428 Sep 4 18:43 local.tar.gz
5.6 查看压缩文件
# 查看压缩包内容
[root@kid /]# tar tf local.tar.gz
etc/rc.local
5.7 解压缩文件
# 解压至当前目录, 解压得到 etc/rc.local /根目录下有了etc则不会创建, 而是把rc.local 再次放入rc.local
[root@lqz /]# tar xf local.tar.gz
# 将解压内容存储至指定的/tmp目录
[root@student ~]# tar xf /etc/local.tar.gz -C /tmp
[root@kid /]# ll /tmp/etc
total 4
-rw-r--r--. 1 root root 473 Oct 2 2020 rc.local
5.8 配合xargs使用
# 打包/tmp下所有文件
# 先切换到根目录下否则会报错
[root@lqz ~]# cd /
# 查询下所有的文件类型, 并打包成tmp.tar.gz
[root@lqz /]# find tmp/ -type f | xargs tar czf tmp.tar.gz
5.9 命令替换
在bash中, $( )与 `` 都是用来作命令替换的,
命令替换与变量替换差不多, 都是用来重组命令行的, 先完成引号里的命令行, 然后将其结果替换出来, 再重组成新的命令行.
# 打包/tmp下所有文件 $(find /tmp/ -type f) 先得到一个结果, 在以这个结果为另一个命令的 参数.
[root@kid /]# tar czf tmp.tar.gz $(find /tmp/ -type f)
5.10 排除文件压缩
--exclude=排除规则 目录
[root@kid ~]# mkdir dir1 dir2 dir3
[root@kid ~]# ls
dir1 dir2 dir3
# 排除单个文件
[root@kid ~]# tar czf dira.tar.gz --exclude=dir1 ./*
[root@kid ~]# tar tf dira.tar.gz
./dir2/
./dir3/
# 排除多个文件
[root@kid ~]# mkdir dir1 dir2 dir3
[root@kid ~]# ls
dir1 dir2 dir3
[root@kid ~]# tar czf dirb.tar.gz --exclude=dir1 --exclude=dir2 ./*
[root@kid ~]# tar tf dirb.tar.gz
./dir3/
# 将需要排除的文件写入文件中
[root@kid ~]# mkdir dir1 dir2 dir3
[root@kid ~]# ls
dir1 dir2 dir3
[root@lqz ~]# vi paichu.list
dir1
dir2
./paichu.list # 把自己也添加进去不然一起打包...
# 指定需要排除的文件列表, 最后进行打包压缩
[root@kid ~]# tar czfX dirc.tar.gz paichu.list ./*
[root@kid ~]# tar tf dirc.tar.gz
./dir3/
5.11 根目录问题
# tar命令遇到/根目录报错问题
[root@kid ~]# tar czfh local.tar.gz /etc/rc.local
# tar:从成员名称中删除前导“/” 详情见5.11
tar: Removing leading `/' from member names
# 意思就是让我们将路径的 ‘/’ 去除掉
问题原因:
因为我们使用的是绝对路径,而不是相对路径。而tar 命令默认是采用相对路径来进行压缩打包的。
解决办法:
我们需要使用参数 -P(大写)来允许我们使用绝对路径进行压缩打包。
-P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
# 错误示例:
[root@kid ~]# tar czf tmp.tar.gz /tmp
tar: Removing leading `/' from member names
[root@kid ~]# ll tmp.tar.gz
-rw-r--r--. 1 root root 688 Sep 4 19:22 tmp.tar.gz
# 在网上查询资料室看见有人说 将 -P参数加在f 参数前面即可(P在f后面会报错!), 不错我测试是没有问题的, 被修复了吧...
[root@kid ~]# tar czfP tmp2.tar.gz /tmp
[root@kid ~]# ll tmp2.tar.gz
-rw-r--r--. 1 root root 688 Sep 4 19:24 tmp2.tar.gz
5.12 tar命令练习
1. 准备环境
# 安装 数据库服务(包含了mysql)
[root@lqz ~]# yum install mariadb-server -y
# 重启 数据库服务
[root@lqz ~]# systemctl start mariadb
# 创建备份目录
[root@lqz ~]# mkdir /backup
2. 方案1
# 1.mysql备份
[root@lqz ~]# tar cJfP /backup/mysql.tar.gz /var/lib/mysql
tar: /var/lib/mysql/mysql.sock: socket ignored
# tar:/var/lib/mysql/mysql。sock:套接字被忽略
# 2.还原
[root@kid ~]# tar xfP /backup/mysql.tar.gz -C /var/lib/mysql
2. 方案2
# 切换目录
[root@lqz ~]# cd /var/lib/mysql
mysql备份
[root@kid mysql]# tar cJfP /backup/mysql.tar.gz ./*
tar: ./mysql.sock: socket ignored
# tar: ./mysql.sock: sock:套接字被忽略
# 查看
[root@lqz mysql]# tar tf /backup/mysql.tar.gz
...
# 恢复
[root@lqz mysql]# tar xfP /backup/mysql.tar.gz -C /var/lib/mysql
————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————