Tips en Trucs 2024

Comprimeren met Gzip

De Gzip opdracht in Linux gebruikt een verliesvrij compressiealgoritme gebaseerd op de LZ77 codering (Lempel-Ziv uit 1977). Het is ook bekend als LZ1-compressie, wat de basis is voor veel lossy formaten.

Bestanden comprimeert Gzip naar een gecomprimeerd archief met de extensie .gz en behoudt de bestandsrechten, eigendomsmodi (lezen/schrijven/uitvoeren) en toegangs-/wijzigings tijdstempels. Het comprimeert gewone bestanden en negeert symbolische links. Gzip kan zowel bestanden comprimeren als decomprimeren (uitpakken).

Eén bestand

Per definitie comprimeert gzip slechts één bestand, waardoor een gecomprimeerd bestand ontstaat met de extensie .gz of .z. Als je meerdere bestanden of mappen wilt comprimeren, moet je van de bestanden eerst een Tar-archief maken. Daardoor krijgen de gecomprimeerde bestanden de extensie .tar.gz of .tgz.

Wanneer gebruik je gzip?

Gzip wordt in principe alleen gebruikt om tekstbestanden en archieven te comprimeren. Gebruik gzip niet om PDF-, audio- of videobestanden te comprimeren omdat die bestanden reeds gecomprimeerd zijn volgens hun eigen formaten.

Bestanden comprimeren met gzip

Om te oefenen, gebruiken we een groot tekstbestand, namelijk het Nederlands woordenboek. Daarvan maken we een kopie in de thuismap met de opdracht:

dany@pindabook:~$ cp /usr/share/dict/dutch woordenboek.txt

En bekijken we er de eigenschappen van met de opdracht:

dany@pindabook:~$ ls -lh woordenboek.txt 
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:48 woordenboek.txt

Let daarbij vooral op de grootte (4,9 Mbytes). Om dit bestand met gzip te comprimeren, gebruiken we:

dany@pindabook:~$ gzip woordenboek.txt 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 1,3M  7 apr 15:48 woordenboek.txt.gz

De tweede opdracht toont ons dat het 73% kleiner is. Deze opdracht toont ons echter ook dat het originele bestand is verdwenen, wat meestal de bedoeling is als je schijfruimte wilt vrijmaken.

Voor we de volgende gzip opdracht uitvoeren, herstellen we de uitgangssituatie door het gecomprimeerde bestand te verwijderen. Daarna het originele woordenboek terug naar de thuismap te kopiëren en ter controle opnieuw de eigenschappen op te vragen:

dany@pindabook:~$ rm woordenboek.txt.gz 
dany@pindabook:~$ cp /usr/share/dict/dutch woordenboek.txt
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:54 woordenboek.txt

We kunnen het originele bestand behouden, door gebruik te maken van de -k (--keep) optie:

dany@pindabook:~$ gzip -k woordenboek.txt 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:54 woordenboek.txt
-rw-r--r-- 1 dany dany 1,3M  7 apr 15:54 woordenboek.txt.gz

Bij het opvragen van de eigenschappen blijkt dat het originele bestand werd behouden. Opnieuw herstellen we de uitgangssituatie met:

dany@pindabook:~$ rm woordenboek.txt.gz 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:54 woordenboek.txt

Omleiden naar standaard uitvoer

Gzip biedt ook opties om direct naar de standaarduitvoer te schrijven met de optie -c (--stdout). Onderstaande opdracht is een voorbeeld van het maken van een omleiding en het schrijven naar een gecomprimeerd bestand met een zelfgekozen bestandsnaam.

dany@pindabook:~$ gzip -c woordenboek.txt > woordenboek.gz
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 1,3M  7 apr 15:58 woordenboek.gz
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:54 woordenboek.txt

We herstellen de uitgangsituatie met:

dany@pindabook:~$ rm woordenboek.gz

Meerdere bestanden comprimeren

Daarvoor kopiëren we een extra woordenboek naar de thuismap:

dany@pindabook:~$ cp /usr/share/dict/american-english woordenboek_en-us.txt
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 962K  7 apr 16:02 woordenboek_en-us.txt
-rw-r--r-- 1 dany dany 4,9M  7 apr 15:54 woordenboek.txt

Hoewel gzip een enkel bestand comprimeert, kun je meerdere bestanden als argument opgeven en aparte gecomprimeerde bestanden maken. Het volgende voorbeeld comprimeert de twee woordenboeken.

dany@pindabook:~$ gzip woordenboek.txt woordenboek_en-us.txt 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 258K  7 apr 16:02 woordenboek_en-us.txt.gz
-rw-r--r-- 1 dany dany 1,3M  7 apr 15:54 woordenboek.txt.gz

De gzip opdracht heeft dus het gecomprimeerde woordenboek_en-us.txt.gz en woordenboek.txt.gz aangemaakt. Opnieuw herstellen we de uitgangssituatie met:

dany@pindabook:~$ rm woordenboek.txt.gz woordenboek_en-us.txt.gz 
dany@pindabook:~$ cp /usr/share/dict/dutch woordenboek.txt

Compressie percentage

De volgende opdracht toont ons dat het woordenboek 4,9 Megabytes groot is.

dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:07 woordenboek.txt

Net als de zip-opdracht staat gzip ook een reeks compressieniveaus toe. Het waardebereik is van 1 tot en met 9 en de standaardwaarde is 6. De waarde 1 betekent snelle compressie met een minimale compressieverhouding en een waarde van 9 betekent langzamere compressie met maximale compressieverhouding.

dany@pindabook:~$ gzip -1 woordenboek.txt 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 1,7M  7 apr 16:07 woordenboek.txt.gz

Om te vergelijken met de trage, maar betere compressie, herstellen we de situatie, waarna we een maximale compressie uitvoeren:

dany@pindabook:~$ rm woordenboek.txt.gz 
dany@pindabook:~$ cp /usr/share/dict/dutch woordenboek.txt
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:10 woordenboek.txt
dany@pindabook:~$ gzip -9 woordenboek.txt 
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 1,3M  7 apr 16:10 woordenboek.txt.gz

Standaard invoer

Je kunt ook de uitvoer van een andere opdracht (pipe) aan Gzip doorgeven en het comprimeren. Laten we daarvoor eerst het resultaat van de vorige opdracht wissen:

dany@pindabook:~$ rm woordenboek.txt.gz 
dany@pindabook:~$ ls -lh woordenboek*
ls: kan geen toegang krijgen tot 'woordenboek*': Bestand of map bestaat niet

Nu kunnen we zonder eerst een kopie te maken het originele woordenboek comprimeren en opslaan in een archief met een zelf te bepalen naam:

dany@pindabook:~$ cat /usr/share/dict/dutch | gzip -c > woordenboek.txt.gz
dany@pindabook:~$ ls -lh woordenboek*
-rw-r--r-- 1 dany dany 1,3M  7 apr 16:15 woordenboek.txt.gz

We ruimen op met:

dany@pindabook:~$ rm woordenboek.txt.gz

De inhoud van een map comprimeren

Deze keer kopiëren we als test de volledige map met woordenboeken naar onze thuismap:

dany@pindabook:~$ cp -r /usr/share/dict .
dany@pindabook:~$ ls -lh dict/
totaal 5,9M
-rw-r--r-- 1 dany dany 962K  7 apr 16:19 american-english
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:19 dutch
lrwxrwxrwx 1 dany dany    5  7 apr 16:19 nederlands -> dutch
-rw-r--r-- 1 dany dany  199  7 apr 16:19 README.select-wordlist
lrwxrwxrwx 1 dany dany   30  7 apr 16:19 words -> /etc/dictionaries-common/words
lrwxrwxrwx 1 dany dany   16  7 apr 16:19 words.pre-dictionaries-common -> american-english

Met de recursieve optie van gzip kun je alle bestanden van een map en zijn submappen comprimeren tot gz-bestanden:

dany@pindabook:~$ gzip -r dict
gzip: dict/words: Too many levels of symbolic links
gzip: dict/nederlands: Too many levels of symbolic links
gzip: dict/words.pre-dictionaries-common: Too many levels of symbolic links
dany@pindabook:~$ ls -lh dict/
totaal 1,6M
-rw-r--r-- 1 dany dany 258K  7 apr 16:19 american-english.gz
-rw-r--r-- 1 dany dany 1,3M  7 apr 16:19 dutch.gz
lrwxrwxrwx 1 dany dany    5  7 apr 16:19 nederlands -> dutch
-rw-r--r-- 1 dany dany  177  7 apr 16:19 README.select-wordlist.gz
lrwxrwxrwx 1 dany dany   30  7 apr 16:19 words -> /etc/dictionaries-common/words
lrwxrwxrwx 1 dany dany   16  7 apr 16:19 words.pre-dictionaries-common -> american-english

We merken daarbij op dat enkel bestanden gecomprimeerd worden, koppelingen (links) en dergelijke worden genegeerd.

Bestanden uitpakken met gzip

Om archieven te decomprimeren (uit te pakken) gebruikt gzip de -d (--decompress) optie. Alle voorgaande voorbeelden kunnen gecombineerd worden met de -d optie. Hier zijn enkele voorbeelden van decomprimeren, te beginnen met de eenvoudigste vorm:

dany@pindabook:~$ gzip -d dict/dutch.gz 
dany@pindabook:~$ ls -lh dict/dutch*
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:19 dict/dutch

Om de volgende uitpak opdracht te demonstreren, herstellen we het gecomprimeerde archief:

dany@pindabook:~$ gzip dict/dutch
dany@pindabook:~$ ls -lh dict/dutch*
-rw-r--r-- 1 dany dany 1,3M  7 apr 16:19 dict/dutch.gz

Om bij het uitpakken het gecomprimeerde archief te behouden, gebruik je:

dany@pindabook:~$ gzip -dk dict/dutch.gz
dany@pindabook:~$ ls -lh dict/dutch*
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:19 dict/dutch
-rw-r--r-- 1 dany dany 1,3M  7 apr 16:19 dict/dutch.gz

Meerdere archieven met één opdracht uitpakken, gaat als volgt:

dany@pindabook:~$ gzip -d dict/dutch.gz dict/american-english.gz
dany@pindabook:~$ ls -lh dict/dutch* dict/american-english*
-rw-r--r-- 1 dany dany 962K  7 apr 16:19 dict/american-english
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:19 dict/dutch

Na het herstellen van de gecomprimeerde archieven, kunnen we alle archieven in een map uitpakken.

dany@pindabook:~$ gzip dict/dutch dict/american-english
dany@pindabook:~$ gzip -dr dict
gzip: dict/words: Too many levels of symbolic links
gzip: dict/nederlands: Too many levels of symbolic links
gzip: dict/words.pre-dictionaries-common: Too many levels of symbolic links
dany@pindabook:~$ ls -lh dict/
totaal 5,9M
-rw-r--r-- 1 dany dany 962K  7 apr 16:19 american-english
-rw-r--r-- 1 dany dany 4,9M  7 apr 16:19 dutch
lrwxrwxrwx 1 dany dany    5  7 apr 16:19 nederlands -> dutch
-rw-r--r-- 1 dany dany  199  7 apr 16:19 README.select-wordlist
lrwxrwxrwx 1 dany dany   30  7 apr 16:19 words -> /etc/dictionaries-common/words
lrwxrwxrwx 1 dany dany   16  7 apr 16:19 words.pre-dictionaries-common -> american-english

Informatie over gecomprimeerde bestanden opvragen

Eerst herstellen we de gecomprimeerde archieven:

dany@pindabook:~$ gzip -r dict
gzip: dict/words: Too many levels of symbolic links
gzip: dict/nederlands: Too many levels of symbolic links
gzip: dict/words.pre-dictionaries-common: Too many levels of symbolic links

Met de -l (--list) optie kunnen we de details over een gecomprimeerd bestand bekijken, zoals compressieverhouding, bestandsnaam, enz.

dany@pindabook:~$ gzip -lv dict/*.gz
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla fd1fb3b2 Apr  7 16:19              264147              985084  73.2% dict/american-english
defla a4be62cc Apr  7 16:19             1361121             5096240  73.3% dict/dutch
defla f8f38345 Apr  7 16:19                 177                 199  31.7% dict/README.select-wordlist
                                        1625445             6081523  73.3% (totals)
Gzip

Alle voorbeeldbestanden uit deze tip ruimen we op met de opdracht:

dany@pindabook:~$ rm -r dict/