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).
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.
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.
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
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
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
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
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
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.
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
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)
Alle voorbeeldbestanden uit deze tip ruimen we op met de opdracht:
dany@pindabook:~$ rm -r dict/