温馨提示:本文翻译自stackoverflow.com,查看原文请点击:gzip - Why is tar-ing a folder containing some gzipped files as large as the unzipped files?
gzip tar

gzip - 为什么要对包含某些压缩文件和未压缩文件一样大的文件夹进行压缩?

发布于 2020-03-29 13:10:27

给定以下文件夹结构(括号中以字节为单位):

- dir
  - f1.txt (1754)
  - f2.txt (9811)

当我跑步时gzip -r dir,我得到:

 - dir
   - f1.txt.gz (654)
   - f2.txt.gz (804)

现在,当我这样做时tar -cf dir.tar dir(其中dir包含压缩文件),我希望的大小dir.tar大致为654 + 804 = 1450但事实证明,它的大小是10240 f1.txt + f2.txt为什么???

查看更多

查看更多

提问者
stackoverflowed
被浏览
27
pmqs 2020-01-31 17:20

让我们通过一个示例来确认您所看到的内容。

在这里,我有一个目录x,其中包含两个文件。

# ls -l x
total 12
-rw-r--r-- 1 root root 3902 Jan 30 17:00 log1.txt
-rw-r--r-- 1 root root 7518 Jan 30 17:00 log.txt

压缩文件

# gzip -9v x/*
x/log1.txt:  90.6% -- replaced with x/log1.txt.gz
x/log.txt:   84.5% -- replaced with x/log.txt.gz

确认压缩有效

# ls -l x
total 8
-rw-r--r-- 1 root root  392 Jan 30 17:00 log1.txt.gz
-rw-r--r-- 1 root root 1195 Jan 30 17:00 log.txt.gz

将文件放入tar, x.tar

# tar cvf x.tar x
x/
x/log1.txt.gz
x/log.txt.gz

并检查结果大小。我也10240一样

# ls -l x.tar
-rw-r--r-- 1 root root 10240 Jan 31 09:02 x.tar

原因很简单-tar格式以固定的块大小工作,因此NULL字节将有很多填充。详细信息请参见此处对于像这样的小文件,这些填充字节将占主导地位。如果查看此tar文件的十六进制转储,则其中大多数为NULL填充字节。

这就是为什么最好将文件的未压缩版本放入tar,然后对其进行压缩。

这是一个例子。

将未压缩的文件放入 x.tar

# ls -l x
total 12
-rw-r--r-- 1 root root 3902 Jan 30 17:00 log1.txt
-rw-r--r-- 1 root root 7518 Jan 30 17:00 log.txt

# tar cvf x.tar x
x/
x/log1.txt
x/log.txt

# ls -l x.tar
-rw-r--r-- 1 root root 20480 Jan 31 09:06 x.tar

现在压缩tar文件。1761字节要好得多。

# gzip -9v x.tar
x.tar:   91.7% -- replaced with x.tar.gz

# ls -l x.tar.gz 
-rw-r--r-- 1 root root 1761 Jan 31 09:06 x.tar.gz