tar (Unix)和tarfile(Python)之间的根本区别是什么? tar (Unix)和tarfile(Python)之间的根本区别是什么?

5

使用Unix的tar和Python的tarfile压缩文件夹的根本区别是什么,导致了不同的文件大小呢?

在下面的示例中,大小相差8.2 MB。我目前正在使用Mac。此示例中的文件夹包含了一些用于测试目的的随机文本文件。

tar -cvf archive_unix.tar files/

python -m tarfile -c archive_pycli.tar files/ # 使用Python 3.9.6

-rw-r--r--  1 userid  staff  24606720 Oct 15 09:40 archive_pycli.tar
-rw-r--r--  1 userid  staff  16397824 Oct 15 09:39 archive_unix.tar

1
第一步是在两个归档文件上运行 tar -tvf 命令,以查看它们的内容之间可能存在的差异。 - jasonharper
我已经做过这个,并且两者是一样的。我创建了两个文件,包含每个文件的内容,然后比较了这些内容。同样数量的文件存在,所有文件大小都是相同的。 - Simon1
脑海中浮现的一个可能性是您正在处理稀疏文件 - 具有足够长的空字节运行以使整个磁盘块可以从它们的存储中省略的文件。一些tar实现保留了稀疏性,而另一些则没有。然而,这与您将其描述为“随机文本文件”的描述不兼容,因为文本文件根本不应包含空字节。 - jasonharper
1个回答

6
有趣的问题。文档 tarfilehttps://docs.python.org/3/library/tarfile.html)提到,自 Python 3.8 开始,tarfile 创建的 tar 存档的默认格式是 PAX_FORMAT,而由 tar 命令创建的存档则具有 GNU 格式,我认为这就解释了不同之处。
现在让我们制作与 tar 命令相同的存档和一个采用默认格式(与您的命令相同)的存档:
import tarfile
with tarfile.TarFile(name='archive-py-gnu.tar', mode='w', format=tarfile.GNU_FORMAT) as tf:
    tf.add('tmp')
with tarfile.TarFile(name='archive-py-default.tar', mode='w') as tf:
    tf.add('tmp')

作为对比:

$ tar cf archive-tar.tar tmp/
$ ls -l 
3430400 16:28 archive-py-default.tar
3317760 16:28 archive-py-gnu.tar
3317760 16:27 archive-tar.tar

file 命令的结果:

$ file archive_unix.tar
archive_unix.tar: POSIX tar archive (GNU)
$ file archive-py-gnu.tar
archive-py-gnu.tar: POSIX tar archive (GNU)
$ file archive-py-default.tar
archive-py-default.tar: POSIX tar archive

现在我无法告诉你不同格式之间的区别,很抱歉。但我希望这可以帮助你。


感谢您抽出时间帮助我。您的回答让我发现在使用tar时可以更改文件格式,因此我尝试了一下,并确认大小差异是由于不同的存档格式引起的。 - Simon1
@Simon1 很高兴能帮到你。我经常使用 tarfile,但从未注意到这种行为,所以你的问题引起了我的兴趣。 - qouify

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接