为什么 tar-ing 包含一些 gzip 文件的文件夹与解压文件一样大?

Why is tar-ing a folder containing some gzipped files as large as the unzipped files?

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

- 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的大小!为什么???

您似乎为原始文件和压缩文件生成了 tar 文件。为了确定,您可以列出 tar 文件内容。

tar -tf dir.tar.gz

只需 tar + gzip 目录如下:

tar -zcvf dir.tar.gz dir/

希望对您有所帮助。

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

这里我有一个目录,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 字节。有关详细信息,请参阅 here。对于像这样的小文件大小,这些填充字节将占主导地位。如果您查看此 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