Ilija Matoski

    ← Articles

    Compressing multiple files or directories with XZ and TAR

    XZ is one of the best compression tools I’ve seen, it’s compressed files so big to a fraction of their size. I’ve had an 16 GB SQL dump, and it managed to compress it down to 263 MB.

    I’ve needed to compress several files using XZ. And as XZ compresses single files we are gonna have to use TAR to do it And since the newer version of XZ supports multi threading, we can speed up compression quite a bit

    Since the XZ utils in Debian/Ubuntu is an old version I’ve created my own backports that I can use.

    echo "deb http://packages.matoski.com/ debian main" | sudo tee /etc/apt/sources.list.d/packages-matoski-com.list
    curl -s http://packages.matoski.com/keyring.gpg | sudo apt-key add -
    sudo apt-get update
    sudo apt-get install xz-utils

    This should give you a newer version of XZ that supports multi threading.

    Let’s have a directory with a lot of files and subdirectories, to compress it all we would do

    tar -cf - directory/ | xz -9e --threads=8 -c - > tarfile.tar.xz

    On the newer versions of tar you can also do the following too

    XZ_OPT="-9e --threads=8" tar cJf tarfile.tar.xz directory

    Or if you want you can do it separately with a progress bar like this.

    tar -cf - directory/ | (pv -s $(du -sb directory/ | awk '{print $1}') -p --timer --rate --bytes > tarfile.tar)
    xz -9ev --threads=8 tarfile.tar

    This will give you a nice progress bar while it’s creating the archive firstly and then compressing it with XZ