In Linux gebruik je de zip-opdracht om een gecomprimeerd archief van bestanden en mappen te maken.
Hoewel tar (tape archive) veel vaker voorkomt in Linux, is zip nog steeds een handig hulpmiddel om bestanden te comprimeren en te delen met anderen die misschien niet bekend zijn met tar of om bestanden naar Windows-gebruikers te verzenden.
Bovendien kunnen zip-bestanden met encryptie worden gecomprimeerd, zodat je er zeker van kunt zijn dat de inhoud van het bestand veilig blijft en beschermd is tegen ongeoorloofde toegang.
Wat nog belangrijker is, is dat zip-bestanden gemakkelijk in één keer kunnen worden gedeeld en overgedragen als verzamelingen van bestanden, zonder dat elk bestand afzonderlijk hoeft te worden verzonden, wat tijd en moeite bespaart.
Op de meeste Linux-distributies is de zip-opdracht standaard aanwezig, dus daar hoef je je geen zorgen over te maken.
Om de werking van de zip-opdracht te verkennen is het beter om een nieuwe map aan te maken en enkele voorbeelden toe te voegen die we zullen gebruiken om zip-taken op uit te voeren, zoals het maken van zip-bestanden, het weergeven van zip-bestanden, het verwijderen van inhoud uit zip-bestanden, enzovoort.
Laten we een map met de naam test-arena aanmaken en deze openen:
dany@pindabook:~$ mkdir test-arena && cd test-arena
Waar we vijf verschillende bestanden aan toevoegen met behulp van de brace-expansiemethode:
dany@pindabook:~/test-arena$ touch voorbeeld{1..5}.txt
Nu we wat testmateriaal hebben, kunnen we starten met het verkennen van de zip-opdracht.
Als je een zip-bestand met de zip-opdracht wilt maken, moet je eerst de naam van het zip-bestand opgeven en vervolgens de bron van het bestand dat je wilt zippen.
Als je bijvoorbeeld een archief wil maken van alle *.txt-bestanden die beschikbaar zijn in de map test-arena, dan gebruik je daarvoor de volgende opdracht:
dany@pindabook:~/test-arena$ zip voorbeeld.zip *.txt
adding: voorbeeld1.txt (stored 0%)
adding: voorbeeld2.txt (stored 0%)
adding: voorbeeld3.txt (stored 0%)
adding: voorbeeld4.txt (stored 0%)
adding: voorbeeld5.txt (stored 0%)
Zodra je de opdracht uitvoert, worden de bestandsnamen weergegeven die aan het zip-bestand worden toegevoegd, samen met het percentage deflatie (verkleining van de bestandsgrootte met behulp van het deflate-compressiealgoritme).
Het probleem met de voorgaande opdracht is dat het bij het comprimeren van het zip-bestand bestanden in submappen niet worden meegenomen, waardoor je lege mappen krijgt, wat je waarschijnlijk niet wilt.
Om dit te voorkomen, kun je de -r of -R optie gebruiken om de inhoud van een map en submappen recursief te kopiëren.
Om dit aan te tonen voegen we een aantal mappen en submappen in de test-arena map toe:
dany@pindabook:~/test-arena$ mkdir -p map{1..2}/submap{1..2}
De volgende zip-opdracht voegt zelfs lege bestanden toe.
dany@pindabook:~/test-arena$ zip -r voorbeeld.zip *
updating: voorbeeld1.txt (stored 0%)
updating: voorbeeld2.txt (stored 0%)
updating: voorbeeld3.txt (stored 0%)
updating: voorbeeld4.txt (stored 0%)
updating: voorbeeld5.txt (stored 0%)
adding: map1/ (stored 0%)
adding: map1/submap1/ (stored 0%)
adding: map1/submap2/ (stored 0%)
adding: map2/ (stored 0%)
adding: map2/submap1/ (stored 0%)
adding: map2/submap2/ (stored 0%)
Gebruik de optie -R om recursief lege mappen en submappen uit te sluiten:
dany@pindabook:~/test-arena$ zip -R voorbeeld.zip *
updating: voorbeeld1.txt (stored 0%)
updating: voorbeeld2.txt (stored 0%)
updating: voorbeeld3.txt (stored 0%)
updating: voorbeeld4.txt (stored 0%)
updating: voorbeeld5.txt (stored 0%)
Als je enkel een specifieke map wilt comprimeren, geef je enkel de toe te voegen mapnaam op.
dany@pindabook:~/test-arena$ zip -r voorbeeld.zip map1/submap1/ map2/submap1/
updating: map1/submap1/ (stored 0%)
updating: map2/submap1/ (stored 0%)
Bij het maken van een zip-bestand wordt standaard het deflate-algoritme gebruikt om het bestand te comprimeren, maar als je een robuustere compressie wilt gebruiken, kun je andere compressiealgoritmen gebruiken, zoals bzip2.
Om dit aan te tonen, maken we een tekstbestand aan met 5 willekeurige zinnen samengesteld met woorden uit het Nederlands woordenboek:
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> willekeurige_tekst.txt; echo >> willekeurige_tekst.txt; done
Bekijk de inhoud van het willekeurige tekst bestand met:
dany@pindabook:~/test-arena$ cat willekeurige_tekst.txt
ezeltje menseneten nachtblinde inwerking circusatelier
Decembermoorden scheldkanonnades potloodslijpmachine tafelspel necrofielen
wordprocessor mollenvel Adventurebank verbindende braverik
daterende graafwiel incontinente jeugdrechtbanken minderwaarde
Heskes junken principeverklaring zeepier priesterwijdingen
Om het bzip2-compressiealgoritmen te gebruiken, gebruik je de -Z optie en geef je de naam van het algoritme:
dany@pindabook:~/test-arena$ zip -Z bzip2 voorbeeld.zip *
updating: voorbeeld1.txt (stored 0%)
updating: voorbeeld2.txt (stored 0%)
updating: voorbeeld3.txt (stored 0%)
updating: voorbeeld4.txt (stored 0%)
updating: voorbeeld5.txt (stored 0%)
updating: map1/ (stored 0%)
updating: map2/ (stored 0%)
adding: willekeurige_tekst.txt (bzipped 23%)

Een andere interessante optie is --exclude, waarmee je een map of bestand kunt uitsluiten van het patroon dat je wilt opnemen bij het maken van een zip-bestand.
Stel dat we enkel de map ~/test-areana/map1 met alle eventuele inhoud willen negeren:
dany@pindabook:~/test-arena$ zip -r voorbeeld.zip * --exclude "map1*"
updating: voorbeeld1.txt (stored 0%)
updating: voorbeeld2.txt (stored 0%)
updating: voorbeeld3.txt (stored 0%)
updating: voorbeeld4.txt (stored 0%)
updating: voorbeeld5.txt (stored 0%)
updating: map2/ (stored 0%)
updating: map2/submap1/ (stored 0%)
updating: map2/submap2/ (stored 0%)
updating: willekeurige_tekst.txt (deflated 35%)
De volgende vraag die opkomt, is of het mogelijk is om de inhoud van een zip-bestand weer te geven zonder het zip-bestand uit te pakken. Dat kan met de opties -sf of --show-files:
dany@pindabook:~/test-arena$ zip -sf voorbeeld.zip
Archive contains:
voorbeeld1.txt
voorbeeld2.txt
voorbeeld3.txt
voorbeeld4.txt
voorbeeld5.txt
map1/
map1/submap1/
map1/submap2/
map2/
map2/submap1/
map2/submap2/
willekeurige_tekst.txt
Total 12 entries (316 bytes)
Met de zip-opdracht kun je nieuwe bestanden of mappen toevoegen aan een bestaand zip-bestand. Je kunt dus makkelijk nieuwe dingen toevoegen of dingen bijwerken zonder dat je er een nieuw zip-bestand voor hoeft te maken.
Je kunt een zip-bestand op twee manieren wijzigen: de ene manier werkt de inhoud van het zip-bestand bij met nieuwe gegevens, en de andere manier werkt niet alleen de vorige inhoud van het zip-bestand bij, maar voegt ook nieuwe bestanden en mappen toe.
Eerst maken we een nieuw tekstbestand aan:
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> nieuwe_tekst.txt; echo >> nieuwe_tekst.txt; done
Om bij te werken en nieuwe bestanden toe te voegen, kun je de optie -u of --update gebruiken:
dany@pindabook:~/test-arena$ zip -u voorbeeld.zip nieuwe_tekst.txt
adding: nieuwe_tekst.txt (deflated 36%)
En maken we nog een nieuw tekstbestand aan:
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> tekst.txt; echo >> tekst.txt; done
Om alle bestanden en submappen in een map bij te werken of toe te voegen:
dany@pindabook:~/test-arena$ zip -u voorbeeld.zip *
adding: tekst.txt (deflated 34%)
We geven het tekstbestand tekst.txt een nieuwe inhoud en voeren nogmaals een update van het zip-bestand uit:
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> tekst.txt; echo >> tekst.txt; done
dany@pindabook:~/test-arena$ zip -u voorbeeld.zip *
updating: tekst.txt (deflated 37%)
Om het verschil met de tweede manier aan te tonen, geven we het tekstbestand tekst.txt een nieuwe inhoud en maken we een nieuw tekstbestand aan:
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> tekst.txt; echo >> tekst.txt; done
dany@pindabook:~/test-arena$ for i in {1..5}; do shuf -n 5 /usr/share/dict/nederlands | tr '\n' ' ' >> nieuw.txt; echo >> nieuw.txt; done
Als je enkel de inhoud van het zip-bestand wilt bijwerken met nieuwe gegevens, gebruik je de -f of –freshen optie:
dany@pindabook:~/test-arena$ zip -f voorbeeld.zip
freshening: tekst.txt (deflated 40%)
Nadat je een bestand in een map hebt verwijderd, maar wanneer je zip -sf voorbeeld.zip uitvoert, wordt aangegeven dat het bestand nog in het zip-bestand aanwezig is.
Als het bestand niet meer nodig is, kan je om verdere verwarring te voorkomen het uit het zip-bestand verwijderen.
Je kunt eenvoudig afzonderlijke onderdelen uit het zip-bestand verwijderen of wissen met behulp van de optie -d of --delete:
dany@pindabook:~/test-arena$ zip -d voorbeeld.zip voorbeeld5.txt
deleting: voorbeeld5.txt
Als het bestand in een submap staat, moet je het pad aangeven waar het bestand in het zip-bestand staat. Hier staat bijvoorbeeld voorbeeld5.txt in voorbeeld.zip/submap1/voorbeeld5.txt, dus je hoeft alleen maar submap1/voorbeeld5.txt te gebruiken nadat je de naam van het zip-bestand hebt opgegeven.
dany@pindabook:~/test-arena$ zip -d voorbeeld.zip submap1/voorbeeld5.txt
zip warning: name not matched: submap1/voorbeeld5.txt
zip error: Nothing to do! (voorbeeld.zip)
Zoals je merkt, krijg je foutmeldingen als je de zip opdracht onuitvoerbare taken laat uitvoeren, zoals het verwijderen van onbestaande inhoud.
Met de zip-opdracht kun je ook een zip-bestand met een wachtwoord versleutelen, zodat alleen geautoriseerde gebruikers toegang hebben tot het bestand.
Om een zip-bestand te versleutelen, gebruik je de -e of --encrypt optie om een wachtwoord in te stellen dat nodig is tijdens het uitpakken van het zip-bestand.
dany@pindabook:~/test-arena$ zip -e voorbeeld.zip voorbeeld1.txt voorbeeld2.txt voorbeeld3.txt
Enter password:
Verify password:
updating: voorbeeld1.txt (stored 0%)
updating: voorbeeld2.txt (stored 0%)
updating: voorbeeld3.txt (stored 0%)
Dit werkt alleen bij het toevoegen en bijwerken van bestanden, m.a.w. reeds in het zip-bestand aanwezige bestanden worden niet versleuteld:
dany@pindabook:~/test-arena$ zip -e voorbeeld.zip
Enter password:
Verify password:
zip error: Nothing to do! (voorbeeld.zip)
Dit kan je enkel oplossen door het zip-bestand helemaal opnieuw aan te maken.
Laten we eerst eens kijken naar het uitpakken van een zip-bestand in de huidige map.
dany@pindabook:~/test-arena$ unzip voorbeeld.zip
Archive: voorbeeld.zip
replace voorbeeld1.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
extracting: voorbeeld1.txt
replace voorbeeld2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace voorbeeld3.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
extracting: voorbeeld3.txt
extracting: voorbeeld4.txt
inflating: willekeurige_tekst.txt
inflating: nieuwe_tekst.txt
inflating: tekst.txt
inflating: nieuw.txt
Als je een bestand naar een specifieke map wilt uitpakken, gebruik dan de -d optie om het pad van de map op te geven waar je het bestand wilt uitpakken.
dany@pindabook:~/test-arena$ unzip voorbeeld.zip -d ~/uitgepakt
Archive: voorbeeld.zip
extracting: /home/dany/uitgepakt/voorbeeld1.txt
extracting: /home/dany/uitgepakt/voorbeeld2.txt
extracting: /home/dany/uitgepakt/voorbeeld3.txt
extracting: /home/dany/uitgepakt/voorbeeld4.txt
creating: /home/dany/uitgepakt/map1/
creating: /home/dany/uitgepakt/map1/submap1/
creating: /home/dany/uitgepakt/map1/submap2/
creating: /home/dany/uitgepakt/map2/
creating: /home/dany/uitgepakt/map2/submap1/
creating: /home/dany/uitgepakt/map2/submap2/
inflating: /home/dany/uitgepakt/willekeurige_tekst.txt
inflating: /home/dany/uitgepakt/nieuwe_tekst.txt
inflating: /home/dany/uitgepakt/tekst.txt
inflating: /home/dany/uitgepakt/nieuw.txt
Deze keer moeten we enkel de gebruikte testmappen wissen:
dany@pindabook:~$ rm -r test-arena/ uitgepakt/