为什么 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
给定以下文件夹结构(括号中的大小以字节为单位):
- 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