# 文件压缩解压

# Flag

rar tar zip 7z 是归档容器,里面可以放多个文件、有目录结构,其中 tar本身不带压缩

rar 带单独的压缩算法(据说类 Deflate),加密算法(AES),有相对完善的压缩过滤器

zip 压缩算法Deflate,因为历史问题被迫成为多算法的加密容器(互不兼容的 AES),压缩比相对不太高, 不识别文件名的编码,有特殊的带过滤格式 zipx。gz是zip算法的一个GNU实现。

7-zip 压缩算法 LZMA、LZMA2、ppmd、bzip2,加密算法(AES),有初步的过滤能力

tar 可以和压缩或加密格式串用,tar.gz tar.bzip2 tar.xz tar.lzma 都是常见的压缩格式组合压缩算法方面, 对常规文件现在 7z 自带的 lzma2 是最佳选择,对多媒体文件,可考虑 rar 和 zipx

xz的默认压缩级别是6。7z的默认压缩级别是5,至少在字典大小上相当于xz的压缩级别7,另外7z默认开了多线程,有多核可用的时候表现会好些

xz和7z的默认参数压缩算法都是lzma2(tar能解压7z,7-zip也能解压xz),这个算法出自7-zip作者Igor Pavlov

# tar

tar是在Linux中使用得非常广泛的文档打包格式(保留 unix 风格的文件权限)。它只消耗非常少的CPU以及时间去打包文件, 但它仅仅只是一个打包工具,并不负责压缩。

实际使用中,除了要打包之外,往往还需要其他的压缩命令一起出现进行一下压缩,提高空间利用率。

参数

  • 命令类型参数:

    1. -c–create:建立新的备份文件。
    2. -x–extract–get:从备份文件中还原文件。
  • 压缩方式参数:

    1. -j–bzip2:以bz2的算法来压缩或者解压文件。
    2. -z–gzip–ungzip:通过 gzip 指令处理备份文件。
  • 其他常用参数:

    1. -v–verbose:显示指令执行过程。
    2. -C <目的目录>–directory=<目的目录>:切换到指定的目录。

压缩

# 将目标打包成一个*.tar格式的文件
tar -cvf 名称.tar 目录或文件

# 将目标打包成一个*.tgz格式的文件
tar -czvf 名称.tgz 目录或文件

# 将目标打包并压缩成一个*.tar.gz格式的文件
tar -czvf 名称.tar.gz 目录或文件

# 将目标打包并压缩成一个*.tar.bz2格式的文件
tar -cjvf 名称.tar.bz2 目录或文件

# 将打包好的tar文件压缩成一个*.tar.xz格式的文件				
xz -z 名称.tar.xz
# 或者一条命令执行
tar -Jcvf 文件名.tar.xz 目录或文件

# 将目标打包并压缩成一个*.tar.7z格式的文件
tar cvf - 目录或文件 | 7z a -si 文件名.tar.7z

注意:在使用tar--exclude命令排除打包时,末尾不能加/或者路径为绝对路径,否则还是会把排除目录以及其下的文件打包进去。

# 打包的时候我们要排除 tomcat/logs 目录,命令如下:
tar -zcvf tomcat.tar.gz --exclude=tomcat/logs tomcat

# 如果要排除多个目录,增加 --exclude 即可,如下命令排除logs和libs两个目录及文件xiaoshan.txt
tar -zcvf tomcat.tar.gz --exclude=tomcat/logs --exclude=tomcat/libs --exclude=tomcat/xiaoshan.txt tomcat

解压

参数-C解压到指定目录下

# 解压一个*.tar的文件包内容到当前目录下
tar -xvf pakage_name.tar

# 解压一个*.tgz的文件包内容到当前目录下							
tar -xzvf pakage_name.tgz

# 解压一个*.tar.gz的压缩包内容到当前目录下
tar -xzvf pakage_name.tar.gz

# 解压一个*.tar.bz2的压缩包内容到当前目录下
tar -xjvf pakage_name.tar.bz2

# tar.xz压缩包需要先解压为tar格式包
xz -d pakage_name.tar.xz
# 再解开tar格式包到当前目录下
tar -xvf pakage_name.tar
# 或者一条命令执行
tar -Jxvf 文件名.tar.xz

# 7zip

注意:所有的参数和值之间是没有空格的

参数

  • a 添加文件或文件夹到压缩包。
  • b 基准
  • d 从存档中删除文件
  • e 从存档中提取文件(不使用目录名)
  • h 计算文件的哈希值
  • i 显示有关受支持格式的信息
  • l 列出档案内容
  • rn 重命名存档中的文件
  • t 测试档案的完整性
  • u 更新文件以存档
  • x 解压文件,保留原来的目录结构
  • -t 指定压缩类型,默认7z。
  • -r 表示递归所有的子文件夹。
  • -mmt[N] 设置CPU线程数
  • -mx=值 设置压缩级别:-mx1(最快),-mx9(最慢,压缩比最高),默认为5。
  • -ao 设置覆盖模式,a全部覆盖
  • -o 指定解压到的目录
# CentOS安装7zip
yum –y install p7zip

# 解压到当前目录下,不保留原来的目录结构
7za e 文件名

# 解压到当前目录下,但保留原来的目录结构
7za x 文件名

# 用7z压缩成tar
7za a -ttar 文件名.tar 文件夹

# 用7z把tar压缩成gz
7za a -tgzip 文件名.tar.gz 文件名.tar

# Deflate

在1990年左右,Info-ZIP组编写了可移植的,免费开源的实用程序zip和unzip实用程序,使用Deflate进行压缩以及对zip和早期格式进行解压缩

在90年代初期,gzip格式被开发为Unix compress实用程序的替代,它是从Info-ZIP实用程序中的Deflate代码衍生而来

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。zlib是从gzip代码改编而来

# zip

zip是压缩程序

参数

  • A 调整可执行的自动解压缩文件。
  • d 从压缩文件内删除指定的文件。
  • D 压缩文件内不建立目录名称。
  • F 尝试修复已损坏的压缩文件。
  • g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
  • j 只保存文件名称及其内容,而不存放任何目录名称。
  • m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
  • o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
  • q 不显示指令执行过程。
  • r 递归处理,将指定目录下的所有文件和子目录一并处理。
  • S 包含系统和隐藏文件。
  • v 显示指令执行过程或显示版本信息。
  • <压缩效率> 压缩效率是一个介于 1-9 的数值。
zip 文件名.zip 文件或目录

# unzip

unzip是解压程序。

参数

  • f 更新现有的文件。
  • l 显示压缩文件内所包含的文件。
  • v 执行是时显示详细的信息。
  • C 压缩文件中的文件名称区分大小写。
  • j 不处理压缩文件中原有的目录路径。
  • L 将压缩文件中的全部文件名改为小写。
  • n 解压缩时不要覆盖原有的文件。
  • o 不必先询问用户,unzip 执行后覆盖原有文件。
  • P<密码> 使用 zip 的密码选项。
  • q 执行时不显示任何信息。
  • [.zip 文件] 指定.zip 压缩文件。
  • [文件] 指定要处理.zip 压缩文件中的哪些文件。
  • d<目录> 指定文件解压缩后所要存储的目录。
  • x<文件> 指定不要处理.zip 压缩文件中的哪些文件。
unzip 文件名.zip