【问题标题】:What is the fundamental difference between tar (Unix) and tarfile (Python)?tar (Unix) 和 tarfile (Python) 之间的根本区别是什么?
【发布时间】:2021-10-15 13:50:39
【问题描述】:

在 Unix 上使用 tar 和在 Python 中使用 tarfile 对文件夹进行 tar 压缩导致文件大小不同的根本区别是什么?

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

tar -cvf archive_unix.tar files/

python -m tarfile -c archive_pycli.tar files/ # using 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

【问题讨论】:

  • 第一步是在两个存档上运行tar -tvf,看看它们的内容之间可能存在什么差异。
  • 我已经这样做了,两者都是一样的。我创建了两个包含每个文件内容的文件,然后比较了这些内容。存在相同数量的文件并且所有文件大小都相同。
  • 想到的一种可能性是您正在处理 sparse files - 具有足够长的空字节运行的文件,可以从其存储中省略整个磁盘块.一些tar 实现保持稀疏性,有些则没有。但是,这与您将这些描述为“随机文本文件”不兼容,因为文本文件根本不应该包含空字节。

标签: python tar tarfile


【解决方案1】:

有趣的问题。 tarfile的文档 (https://docs.python.org/3/library/tarfile.html) 提到 tarfile 创建的 tar 存档的默认格式是,因为 python 3.8, PAX_FORMATtar 命令创建的档案有 我相信 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 很高兴我能帮上忙。我经常使用tarfile,但从未注意到这种行为,所以你的问题让我很感兴趣。
猜你喜欢
  • 2014-09-04
  • 2011-11-04
  • 2015-12-13
  • 1970-01-01
  • 2016-05-06
  • 2017-01-17
  • 2011-11-21
  • 2017-04-15
  • 1970-01-01
相关资源
最近更新 更多