Warum sind tar.xz-Dateien, die mit Python tar erstellt wurden, 15-mal kleiner als macOS tar?

Ca. übers. : Dies ist keine gewöhnliche Übersetzung, da sie nicht auf einem separaten Artikel basiert, sondern auf einem aktuellen Fall mit Stack Exchange, der diesen Monat zum Haupthit der Ressource wurde. Der Autor stellt eine Frage, deren Antwort sich für einige Website-Besucher als echte Offenbarung herausstellte.





Beim Komprimieren von Verzeichnissen um ~ 1,3 GB mit jeweils 1440 JSON-Dateien stellte ich einen 15-fachen Unterschied zwischen der Größe von Archiven fest, die mit tar



macOS oder Raspbian 10 (Buster) komprimiert wurden, und Archiven, die mit der in Python integrierten Tarfile- Bibliothek erstellt wurden .





Minimales Arbeitsbeispiel

Dieses Skript vergleicht beide Methoden:





#!/usr/bin/env python3

from pathlib import Path 
from subprocess import call 
import tarfile

fullpath = Path("/Users/user/Desktop/temp/tar/2021-03-11") 
zsh_out = Path(fullpath.parent, "zsh-archive.tar.xz") 
py_out = Path(fullpath.parent, "py-archive.tar.xz")

# tar using terminal 
# tar cJf zsh-archive.tar.xz folderpath
call(["tar", "cJf", zsh_out, fullpath])

# tar using tarfile library 
with tarfile.open(py_out, "w:xz") as tar:
    tar.add(fullpath, arcname=fullpath.stem)

# Print filesizes 
print(f"zsh tar filesize: {round(Path(zsh_out).stat().st_size/(1024*1024), 2)} MB") 
print(f"py tar filesize: {round(Path(py_out).stat().st_size/(1024*1024), 2)} MB")
      
      



Das Ergebnis ist folgendes:





zsh tar filesize: 23.7 MB
py tar filesize: 1.49 MB
      
      



Folgende Versionen wurden verwendet:





  • tar



    unter MacOS : bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6



    ;





  • tar



    Raspbian um 10 : xz (XZ Utils) 5.2.4 liblzma 5.2.4



    ;





  • tarfile



    Python: 0.9.0



    .





:





diff -r py-archive-expanded zsh-archive-expanded
      
      



.





« » ( ) :





➜ diff zsh-archive.tar.xz py-archive.tar.xz
Binary files zsh-archive.tar.xz and py-archive.tar.xz differ
      
      



Quicklook ( Betterzip) , -:





Links ist zsh-archive.tar.xz, rechts ist py-archive.tar.xz.
— zsh-archive.tar.xz, — py-archive.tar.xz.

zsh



, Python — . , .





? ? , Python- ? 15- - Python-?





: , tarlib



Python ; BSD- tar



.





:

, , BSD- GNU- tar



.





GNU tar



--sort



:





ORDER



, none



, name



inode



.





--sort=none



— , .





GNU tar

GNU tar



Mac:





brew install gnu-tar
      
      



'tar' , --sort



:





gtar --sort='name' -cJf zsh-archive-sorted.tar.xz /Users/user/Desktop/temp/tar/2021-03-11
      
      



zsh-archive-sorted.tar.xz



1,5 — , , Python-.





, , JSON-, ( — unixtime), BSD tar



:





cat *.json > all.txt
tar cJf zsh-cat-archive.tar.xz all.txt
      
      



zsh-cat-archive.tar.xz



1,5 .





Python- tarfile

, TarFile.add Python , tarfile



Python :





. , recursive False. .





, , , :





JSON- . , .





, . , .





P.S.

UPD: — XZ/LZMA — , @iliazeus!





:





  • «Git happens! 6 Git »;





  • « »;





  • « ».








All Articles