12-Linux压缩与解压

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常见压缩包类型

格式压缩工具
.zipzip压缩工具
.gzgzip压缩工具,只能压缩文件,会删除原文件(通常配合tar使用)
.bz2bzip2压缩工具,只能压缩文件,会删除原文件(通常配合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  

————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值