Compress and Extract 压缩与解压

.tar.gz 和 .tgz

.tgz 和 .tar.gz 是同一个东西, .tgz 可以认为是 .tar.gz 是简写, 在远古时代比如 DOS 系统, 文件扩展名只能是三个字符, 所以有了 .tgz, 后来限制解除之后就能支持 .tar.gz 这种后缀了, 后者能更清晰地表达打包格式和压缩方式.

https://stackoverflow.com/questions/11534918/are-tar-gz-and-tgz-the-same-thing

这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多 CPU 的,而且可以得到一个非常理想的压缩率
默认 tar 打包和系统默认的压缩工具是单线程的,pigz 是 gzip 的多线程实现, 默认用当前逻辑 cpu 个数来并发压缩,无法检测个数的话,则并发8个线程

压缩

tar -czvf all.tar.gz *.jpg

# 排除掉文件
tar -czvf tomcat.tar.gz --exclude=tomcat/logs tomcat

# 设置压缩级别
GZIP=-9 tar cvzf file.tar.gz /path/to/directory

压缩到指定目录

tar -zcvf /data/tmp/foo.tar.gz /data/server/source
# 解压到指定目录
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.1.tgz

tar.gz, tgz 解压

tar -xf foo.tar.gz
# 解压 tar.gz 文件时, 不使用 z 参数, 貌似 tar 会检测文件类型 自动 用 gzip 解压...
tar xvf all.tar.gz
tar zxvf all.tar.gz
tar -zxvf all.tar.gz

解压到指定目录

tar zxvf /path/to/foo.tar.gz -C /path/to/target/dir/
tar -zxvf /path/to/foo.tar.gz -C /path/to/target/dir/
sudo pacman -S pigz
# 压缩
tar --use-compress-program=pigz -cvpf package.tgz ./package
# 解压
tar --use-compress-program=pigz -xvpf package.tgz -C ./package

#tar –use-compress-program=pigz表示指定pigz来进行打包
#c表示create创建 x表示extract解压 v表示verbose详细 f表示指定压缩文件 C表示指定目录
#-cvpf package.tgz ./ 表示将./package目录打包为package.tgz
#-xvpf package.tgz -C ./表示将package.tgz解压到./package目录下
\-v, --verbose #详细显示处理的文件
\-f, --file [HOSTNAME:]F #指定存档或设备 (缺省为 /dev/rmt0)
\-z, --gzip, --ungzip #用 gzip 对存档压缩或解压
\-x, --extract, --get #从存档展开文件

解压多个文件

ls *.gz|xargs -t -n1 gunzip
gunzip *.gz

.rar

# 解压
unrar x foo.rar
# 压缩
rar e FileName.rar
# 解压
rar a FileName.rar

解压并指定输出目录

gunzip -c /data/tmp/foo.tar.gz | tar xf - -C /data/server/bar

.7z

yum install p7zip
pacman -S p7zip
sudo apt install p7zip-full p7zip-rar

# 压缩
7z a -t7z -r manager.7z /home/manager/*
# a 代表添加文件/文件夹到压缩包
# -t 是指定压缩类型 一般我们定为7z
# -r 表示递归所有的子文件夹,manager.7z 是压缩好后的压缩包名,/home/manager/* 是要压缩的目录,*是表示该目录下所有的文件。

7z x filename.7z

.zip

pacman -S zip unzip

zip 压缩

zip all.zip *.jpg

# 指定压缩文件目录
zip ~/all.zip *.jpg

# 压缩的是个文件夹, -r 表示调用递归压缩
zip -r temp.zip temp

# 密码
zip -P password0 foo.zip foo.txt

# 压缩目录并加密码 (-r 递归, -P 指定密码)
zip -r -P password0 foo.zip foo/

# 交互式输入密码(更安全,密码不会暴露在命令历史中)
zip -r -e foo.zip foo/

# 指定压缩某几个文件
zip foo.zip foo.txt bar.txt

zip 分卷压缩

# 分卷压缩的话,需要先将文件打包成一个zip包,然后执行
zip -s SIZE origin.zip --out new.zip

# SIZE为分卷的大小4m,4g,4t等
# 解压的时候需要先将它合并才能正常解压
zip spiltfile.zip -s=0 --out single.zip

zip 列出内容(不解压)

unzip -l myfile.zip
unzip -l /path/to/myfile.zip | head

-l(list)只列出压缩包内文件清单,不解压。输出列依次为原始大小、日期、时间、文件名。想先看包里有什么、或确认路径对不对时用这个。

更详细的列表(含压缩方式、压缩前后大小、压缩率等)用 -v:

unzip -v myfile.zip

非标准 ZIP(例如 Java 的 .jmod 文件带 4 字节 JM 头)有时也能列出,但开头可能提示 extra bytes;一般查看内容够用。

zip 读取到 stdout(不落盘)

# View a text file inside the archive
unzip -p myfile.zip path/to/foo.txt

# Pipe to other commands
unzip -p myfile.zip config.json | jq .
unzip -p myfile.zip README.md | less
grep -i error <(unzip -p logs.zip app.log)

-p(pipe)把指定条目的解压后内容写到 stdout,不在当前目录落盘,也不打印解压进度等提示。适合快速查看文本、或把包内文件交给管道下游(grep、jq、less 等)。

只读单个文件时,在压缩包名后面跟路径即可;路径须与 unzip -l 列出的名称一致(含目录层级)。多个文件会按顺序拼接输出到 stdout,中间没有分隔符,一般只对一个条目用 -p。

与 -l 的区别:-l 只看清单;-p 是真正解压数据,只是写到管道而非磁盘。与 unzip foo.zip path/to/foo.txt 的区别:后者会在当前目录(或 -d 指定目录)写出文件;-p 不写文件。

zip 解压

unzip all.zip
unzip -o -d /home/sunny myfile.zip

# 解压 多个文件
ls *.zip | xargs -n1 unzip -o

# -o: 不必先询问用户,unzip执行后覆盖原有的文件;
# -P<密码>: 使用zip的密码选项;
# -d 指定解压的目标目录

# 解压最近4天的zip文件

find . -maxdepth 1 -mtime -4 -type f  -name "*.zip"|xargs -t -n1 unzip

zip 解压并指定目录

unzip /path/to/source.zip -d /path/to/target/path

Zstandard, zstd, .zst

解压

zstd -d foo.zst

zstd 不能压缩目录, -r 参数会把目录里的文件压缩成单独的文件

.tar.zst

tar 从 1.30.90 之后开始支持 zstd 有些发行版默认没有安装 zstd 需要安装一下, 比如 dnf install zstd

# 压缩
tar -I zstd -cvf foo.tar.zst foo

# 解压
tar -I zstd -xvf foo.tar.zst

.zst

# -z 压缩, 不加参数,默认为压缩
zstd foo.txt
zstd -z foo.txt

# -d 解压
zstd -d foo.txt.zst
unzstd foo.txt.zst

# 指定压缩级别 1-19 默认3
zstd -6 foo.txt

# 线程数, 线程数为 0 时 zstd 会自动检测 cpu 核心数
zstd -T0 foo.txt
# --rm 压缩后删除原文件

.tar

tar 命令可以把多个文件打包成一个文件, 还可以向 tar 包里添加文件或提取某一个文件. tar 最初被用来在磁带上创建归档文件.
Tar 是在 Linux 中使用得非常广泛的文档打包格式。它的好处就是它只消耗非常少的 CPU 以及时间去打包文件,tar 仅仅只是一个打包工具,没有压缩的功能。

dnf install tar gzip
# 打包: -c 是表示产生新的包,-f 指定包的文件名。
tar cvf FileName.tar DirName

# 解包:
tar xvf FileName.tar

# 将目录 logs 打包压缩并分割成多个 1M 的文件
tar cjf - logs/ |split -b 1m - logs.tar.bz2.

# 合并文件
cat logs.tar.bz2.a* | tar xj

# 指定操作目录
tar -zcf foo.tar.gz -C ${war_path} .
# 解压的时候用 -C, 比如当前目录是 /root, 执行以下命令, 会把 文件 /path/to/foo.tar.gz 解压到 /tmp
tar zxvf /path/to/foo.tar.gz -C /tmp

# tar xxx.tar --strip 1,--strip 1 的意思是表明把解压文件的内容里的所有最上层目录去掉。
tar xvf /backup/bitwarden-data.tar -C /tmp --strip 1

BSD tar VS GNU tar

Mac 打包的 tar.gz 在 archlinux 解压时报错

tar: Ignoring unknown extended header keyword ‘LIBARCHIVE.xattr.com.apple.provenance’

Mac is built based on BSD by default. So, we can use a bunch of command on Linux without installing. But, if you use Mac with CentOS in parallel, you will get trouble which caused by the difference between Mac and CentOS environments.

# 在 Mac OS 上安装 GNU tar
brew install gnu-tar
# 查看 GNU tar  版本
gtar --version
# 用 GNU tar 打包+压缩
gtar czvf example.tar.gz example

https://superuser.com/questions/318809/linux-os-x-tar-incompatibility-tarballs-created-on-os-x-give-errors-when-unt

https://medium.com/@fullsour/installing-gnu-tar-on-mac-827a494b1c1

向已有的 tar 包里增加文件

这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

tar -rf all.tar *.gif

tar 参数

-c, --create : 创建新的压缩文件
-z : 用 gzip 压缩或解压
-x : 从压缩的文件中提取文件
-v : 打包过程中打印文件名
-f, --file=ARCHIVE : 指定文件或设备, 如果不加这个参数 tar 默认会去找环境变量里配置的 TAPE, 注意,在 f 之后要立即接文件名, 不要再加其它参数, 例如使用『tar -zcvfP tfile sfile』就是错误的写法,要写成 『tar -zcvPf tfile sfile』才对
-t : 查看 tarfile 里面的文件, 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在因为不可能同时压缩与解压缩。 
-j : 是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-p : 使用原文件的原来属性 (属性不会依据使用者而变)  
-P : 可以使用绝对路径来压缩! 
-N : 比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! 
--exclude FILE: 在压缩的过程中,不要将 FILE 打包!  
-C : 在执行后续的指令前切换目录, 此参数是顺序敏感的.
-A 新增压缩文件到已存在的压缩
-B 设置区块大小
-d 记录文件的差别
-r 添加文件到已经创建好的 tar 包里追加文件
-u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
-Z 支持compress解压文件
-l 文件系统边界设置
-k 保留原有文件不覆盖
-m 保留文件不被覆盖
-W 确认压缩文件的正确性

可选参数如下: 
-b 设置区块数目
-C 切换到指定目录, 比如解压到某一个目录
-f 指定压缩文件
-help 显示帮助信息
-version 显示版本信息

.gz

# 压缩
# 直接压缩文件, 压缩成功之后默认会把原文件删掉, 变成 foo.txt.gz
gzip foo.txt

# 压缩 tar 文件到 .tar.gz
gzip foo.tar

# 解压1
gunzip FileName.gz
# 解压2
gzip -d FileName.gz

.tar.bz2

这种压缩格式是我们提到的所有方式中压缩率最好的。当然,这也就意味着,它比前面的方式要占用更多的CPU与时间。

bzip2 -d foo.tar.bz2

.xz

解压: xz -d foo.xz

#.tar.xz
$xz -d ***.tar.xz
$tar -xvf  ***.tar

#按时间打包
tar -czf log.tar.gz *.zip -N 2016/04/20
tar -xf all.tar

unrar x /media/data/homes-backup.rar homes-backup/

t 列出档案文件的内容,查看已经备份了哪些文件。

k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。

m 在还原文件时,把所有文件的修改时间设定为现在。

M 创建多卷的档案文件,以便在几个磁盘中存放。

w 每一步都要求确认。

Linux下的压缩文件剖析

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名 给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar。可是Linux就不同 了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使 用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

在具体总结各类压缩文件之前,首先要 弄清两个概念: 打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这 两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另外的工具将这一大堆文件先打 成一个包,然后再就原来的压缩程序进行压缩。

Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:

tar -uf all.tar logo.gif

这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

tar -tf all.tar

这条命令是列出all.tar包中所有文件,-t是列出文件的意思

tar -xf all.tar

这条命令是解出all.tar包中所有文件,-x是解包的意思

以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

tar调用bzip2

bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用bzip2。下面来举例说明一下:

tar -cjf all.tar.bz2 *.jpg

这条命令是将所有.jpg的文件打成一个tar包,并且调用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

tar -xjf all.tar.bz2

这条命令是将上面产生的包解开。

3)tar调用compress

compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:

tar -cZf all.tar.Z *.jpg

这条命令是将所有.jpg的文件打成一个tar包,并且调用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

tar -xZf all.tar.Z

这条命令是将上面产生的包解开

有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

1)对于.tar结尾的文件

tar -xf all.tar

2)对于.gz结尾的文件

gzip -d all.gz

gunzip all.gz

4)对于.bz2结尾的文件

bzip2 -d all.bz2

bunzip2 all.bz2

5)对于tar.bz2结尾的文件

tar -xjf all.tar.bz2

6)对于.Z结尾的文件

uncompress all.Z

7)对于.tar.Z结尾的文件

tar -xZf all.tar.z

另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

2)对于.rar

要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux

不是免费的;然后安装:

tar -xzpvf rarlinux-3.2.0.tar.gz

cd rar

make

这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

rar a all *.jpg

这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。

unrar e all.rar

这条命令是将all.rar中的所有文件解压出来

到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方 法对于Unix也基本有效。

本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、 compress、uncompress、zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、. tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行操作。

.bz2

解压1: bzip2 -d FileName.bz2

解压2: bunzip2 FileName.bz2

压缩: bzip2 -z FileName

.tar.bz2

解压: tar jxvf FileName.tar.bz2

压缩: tar jcvf FileName.tar.bz2 DirName

———————————————

.bz

解压1: bzip2 -d FileName.bz

解压2: bunzip2 FileName.bz

压缩: 未知

.tar.bz

解压: tar jxvf FileName.tar.bz

压缩: 未知

———————————————

.Z

解压: uncompress FileName.Z

压缩: compress FileName

.tar.Z

解压: tar Zxvf FileName.tar.Z

压缩: tar Zcvf FileName.tar.Z DirName

.lha

解压: lha -e FileName.lha

压缩: lha -a FileName.lha FileName

lha请到: http://www.infor.kanazawa-it.ac.jp/…/lhaunix/下载!

解压后请将lha拷贝到/usr/bin目录 (其他由$PATH环境变量指定的目录也可以) :

cp lha /usr/bin/

.rpm

解包: rpm2cpio FileName.rpm | cpio -div

.lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea

解压: sEx x FileName.*

压缩: sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!

sEx请到: http://sourceforge.net/projects/sex下载!

解压后请将sEx拷贝到/usr/bin目录 (其他由$PATH环境变量指定的目录也可以) :

[root@www2 tmp]# cp sEx /usr/bin/

压缩算法, deflate、gzip、bzip2、lzo、snappy

http://www.infoq.com/cn/news/2017/07/eBay-shopping-i-o?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global

常用的压缩算法主要有: deflate、gzip、bzip2、lzo、snappy等。差别如下所示:

deflate、gzip都是基于LZ77算法与哈夫曼编码的无损数据压缩算法,gzip只是在deflate格式上增加了文件头和文件尾;

bzip2是Julian

Seward开发并按照自由软件/开源软件协议发布的数据压缩算法,Apache的Commons-compress库中进行了实现;

LZO致力于解压速度,并且该算法也是无损算法;

LZ4是一种无损数据压缩算法,着重于压缩和解压缩速度;

Snappy是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,2011年开源。它的目标并非最大程度地压缩,而是针对最快速度和合理的压缩率。


https://blog.csdn.net/wuhenyan/article/details/53117642

https://www.howtoing.com/zstd-fast-data-compression-algorithm-used-by-facebook

https://blog.csdn.net/lj402159806/article/details/76618174

http://blog.csdn.net/silvervi/article/details/6325698

http://blog.csdn.net/xiaotuni/article/details/2099609

http://xxw8393.blog.163.com/blog/static/37256834201172910058899/

归档格式与随机访问

ZIP vs tar.gz vs 7z/RAR

格式 压缩方式 随机访问 压缩率
ZIP 每个文件独立压缩 ✅ seek 到偏移即可 一般
tar.gz 所有文件先合并成一个流再压缩 ❌ 必须从头解压 较好
7z 默认 Solid:所有文件在一个流里 ❌ Solid 模式下不支持 高(比 ZIP 小 30–50%)
RAR 默认 Solid,可关闭 ❌ Solid 模式下不支持 高

Solid 压缩:把文件拼接后再压缩,压缩器能跨文件发现重复模式(如大量相似的 .class),压缩率更高;但要解出第 100 个文件,得先解前 99 个。

为什么 JAR 必须用 ZIP:JVM 一次按需懒加载一个 .class,Solid 压缩会要求为每次类加载解压整个归档,实践上不可用。详见 Spring Boot Executable JAR §启动全流程。

ZIP 的内部结构

ZIP 把中央目录(Central Directory)放在文件末尾,每个文件独立压缩、独立登记:

┌─────────────────────────────────┐  ← 文件开头
│  Local Header + 压缩数据         │  entry 1
├─────────────────────────────────┤
│  Local Header + 压缩数据         │  entry 2
├─────────────────────────────────┤
│  ...                            │
├─────────────────────────────────┤
│  Central Directory              │  索引:每个 entry 的名字 + 字节偏移
├─────────────────────────────────┤
│  End of Central Directory       │  ← 文件末尾,指向中央目录
└─────────────────────────────────┘

读单个文件:seek(偏移) → 读压缩块 → Deflate 解压。其余内容完全不碰——这就是随机访问。

ZIP 为何 35 年仍是主流

  1. 1991 年起开放规范,无专利门槛,各平台原生支持
  2. 资源管理器 / Finder 直接当文件夹打开,零摩擦
  3. 大量「换皮 ZIP」:.jar、.apk、.docx、.xlsx、.epub、.war 本质都是 ZIP
  4. 随机访问很好地满足了「从归档里打开某一个文件」这一最常见场景

ZIP 规范由 PKWARE 以 APPNOTE.TXT 维护,近年(约 2020)新增了 zstd(method 93)、XZ(95)、Brotli(98)等压缩方法 ID。也就是说 ZIP 原则上可内嵌 zstd 压缩条目,兼得高压缩率与逐文件随机访问;但 Windows 资源管理器、macOS Finder 与多数解压工具尚未支持这些方法——规范跑得比生态快。

zstd 与随机访问

标准 zstd 是流式压缩算法,不是归档格式。.tar.zst = tar(收集文件)+ zstd(压缩整个流),与 tar.gz 一样有顺序限制。zstd 有个官方扩展 Zstandard Seekable Format,把数据切成独立 Frame 并在末尾放 Seek Table,从而支持随机访问;但主流工具几乎不支持,仍属小众。

收敛趋势

ZIP 与 zstd 在互相借鉴:ZIP 引入 zstd 压缩(更高压缩率 + 保留随机访问),zstd 加 Seekable 扩展(获得随机访问)。两者都在朝「高压缩 + 随机访问」收敛。这对矛盾是本质性的——更高压缩率要求更大压缩上下文(Solid),随机访问要求更小的独立块,只能折中选块大小:

格式 块大小 用途
EROFS(Linux 内核) 4 KB–1 MB,每块 zstd Android 系统镜像、容器层
SquashFS + zstd 可配置块 嵌入式 Linux、容器镜像
ZIP + zstd(新) 每文件 通用归档(尚未广泛支持)

这些格式服务于「启动时间与内存敏感」的系统(容器、嵌入式、云原生),不太会在通用文件交换中取代 ZIP。

维护记录

时间 修改内容 原因
2026-06-27 新增「归档格式与随机访问」(ZIP/tar.gz/7z/zstd 对比、ZIP 内部结构、Seekable、EROFS/SquashFS) 合并 comments-tree 启动打包文档的归档格式章节
2026-06-24 新增「zip 读取到 stdout」小节,补充 unzip -p 查看或管道处理包内文件而不落盘
2026-06-21 新增「zip 列出内容」小节,补充 unzip -l / -v 查看压缩包内容而不解压的常用场景
2026-06-21 date 改回 2011-11-04(首条 git commit 中的原始发布日期) 修正误设为 2026-04-07 的创建日期
2026-06-21 文件重命名为 compress.md;title/url 更新;旧 url 加 alias compact 非「压缩」;文件名与内容对齐
2026-06-21 title 改为 Compress and Extract 压缩与解压 符合 title 须含英文的规范