• 12-Linux压缩与解压


    1.文件压缩

    1.1 什么是文件压缩?
    较大的文件经压缩后, 产生了另一个较小容量的文件, 这个文件称为压缩文件
    而压缩此文件的过程称为文件压缩.
    
    • 1
    • 2
    1.2 为什么要对文件进行压缩?
    当我们在传输大量的文件时, 通常都会选择将该文件进行压缩, 然后在进行传输.
    首先:压缩后的文件会比压缩前的文件小, 一个28G的文件夹压缩后能达到6G. 
    其次:多个文件传输很慢, 但单个文件传输会很快, 同时还能节省网络的消耗.
    * 每复制一个文件都需要建立一个目录, 这个过程慢.
      复制一个大的文件只需要建立一个目录.
      文件小而多, 则需要建立的目录多...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1.3 压缩包的互通
    windows 接触最多的压缩格式是 rar  zip
    Linux   使用最多的压缩格式是 zip  tar.gz
    
    Linux上的压缩格式放在windows系统下都是可以正常打开的.
    Windows和Linux互通通常选择 zip.
    Linux不支持 Windows下的 RAR 格式的压缩文件.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    3.3 检测压缩包的完整性
    # 查看zip压缩包是否是完整的      
    [root@kid ~]# zip -T dir2.zip 
    test of dir2.zip OK
    
    
    • 1
    • 2
    • 3
    • 4
    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%)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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的压缩数据中未检测到错误。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    3.6 解压位置
    解压zip文件包, 默认解压至当前目录, 也可以通过 -d参数指定解压的路径.
    
    • 1
    # 默认解压路径为当前目录
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 解压zip内容至指定目录  
    [root@kid ~]# unzip dir2.zip  -d /opt/  
    Archive:  dir2.zip
       creating: /opt/dir/
       creating: /opt/dir2/
     extracting: /opt/dir2/2.txt    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. gzip打包与压缩

    gzip只对文件进行压缩, 对目录无效. 压缩包名 = 压缩文件名+.gz 
    压缩文件后对源文件删除, 解压后对压缩包进行删除.
    gzip安装命令: yum install gzip -y  
    
    压缩文件:     gzip    文件名
    压缩包加油:   gzip -d 压缩包名
    查看压缩包:   zcat    压缩包名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    # 创建文件
    [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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    # 使用场景:当需要让某个文件不生效时, 快速关闭和启用配置文件  
    # 将yum源配置全部打包
    [root@kid ~]# cd /etc/yum.repos.d/  
    [root@lqz ~]# gzip *  
    
    • 1
    • 2
    • 3
    • 4

    5. tar打包与压缩

    5.1 tar介绍
    tar是linux下最常用的压缩与解压缩, 支持文件和目录的压缩归档.
    
    • 1
    压缩语法: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           在打包的时候写入需要排除文件或目录  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    5.2 常用打包与压缩组合
    常用打包组合:
        czvf     打包tar.gz格式 常用  
        cjvf     打包tar.bz格式 不怎么用  
        cJf     打包tar.xz格式 不考虑  
    
    常用压缩组合: 
        zxvf     解压tar.gz格式  
        jxvf     解压tar.bz格式  
        xf      自动选择解压模式  
        xvf     显示解压过程  
        tf      查看压缩包内容  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    5.3 tar.gz压缩文件
    * 需要下下载gzip: yum -y install gzip
    
    • 1
    # 创建目录
    [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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    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
    
    • 1
    • 2
    • 3
    • 4
    [root@kid ~]# mkdir dir1 dir2
    [root@kid ~]# tar cjvf dir.tar.bz2 dir1 dir2
    dir1/
    dir2/
    
    • 1
    • 2
    • 3
    • 4
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    5.6 查看压缩文件
    # 查看压缩包内容
    [root@kid /]# tar tf  local.tar.gz 
    etc/rc.local  
    
    • 1
    • 2
    • 3
    5.7 解压缩文件
    # 解压至当前目录, 解压得到 etc/rc.local   /根目录下有了etc则不会创建, 而是把rc.local 再次放入rc.local
    [root@lqz /]# tar xf  local.tar.gz       
          
    
    • 1
    • 2
    • 3
    # 将解压内容存储至指定的/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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    5.8 配合xargs使用
    # 打包/tmp下所有文件  
    # 先切换到根目录下否则会报错
    [root@lqz ~]# cd /  
    # 查询下所有的文件类型, 并打包成tmp.tar.gz 
    [root@lqz /]# find tmp/ -type f | xargs tar czf tmp.tar.gz  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    5.9 命令替换
    在bash中, $( ) `` 都是用来作命令替换的, 
    命令替换与变量替换差不多, 都是用来重组命令行的, 先完成引号里的命令行, 然后将其结果替换出来, 再重组成新的命令行.
    
    • 1
    • 2
    # 打包/tmp下所有文件   $(find /tmp/ -type f)  先得到一个结果, 在以这个结果为另一个命令的 参数.
    [root@kid /]# tar czf tmp.tar.gz $(find /tmp/ -type f)  
    
    • 1
    • 2
    5.10 排除文件压缩
    --exclude=排除规则 目录
    
    • 1
    [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/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # 排除多个文件  
    [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/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    # 将需要排除的文件写入文件中  
    [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/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    5.11 根目录问题
    # tar命令遇到/根目录报错问题
    [root@kid ~]# tar czfh local.tar.gz  /etc/rc.local  
    # tar:从成员名称中删除前导“/” 详情见5.11
    tar: Removing leading `/' from member names
    # 意思就是让我们将路径的 ‘/’ 去除掉
    
    • 1
    • 2
    • 3
    • 4
    • 5
    问题原因:
       因为我们使用的是绝对路径,而不是相对路径。而tar 命令默认是采用相对路径来进行压缩打包的。
    
    解决办法:
      我们需要使用参数 -P(大写)来允许我们使用绝对路径进行压缩打包。
      -P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # 错误示例:
    [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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    5.12 tar命令练习
    1. 准备环境
    # 安装 数据库服务(包含了mysql)
    [root@lqz ~]# yum install mariadb-server -y
    # 重启 数据库服务
    [root@lqz ~]# systemctl start mariadb 
    # 创建备份目录
    [root@lqz ~]# mkdir /backup  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

  • 相关阅读:
    【论文】基于Hadoop的铁路货运大数据平台设计与应用
    css 居中
    MFC的YUV播放器实现
    SpringBoot启动源码-初了解
    初识Java 18-1 泛型
    第4季4:图像sensor的驱动源码解析
    华为OD社招Java岗面经,已OFFER
    hive基于新浪微博的日志数据分析——项目及源码
    2023美团暑期实习自驾仿真算法一面面经
    vue组件间传参以及方法调用总结
  • 原文地址:https://blog.csdn.net/qq_46137324/article/details/126693360