Failide arhiveerimine ja kokkupakkimine

teejuht
 
1.
Sissejuhatus
2.
Arhiveerimise idee ja praktika: tar ja gzip
3.
tar zcvf ja tar zxvf
4.
Tükkideks ehk voulme'deks tegemine split
5.
Data kontrollimine
 
1. Sissejuhatus

Enamasti öeldaks "faile kokku pakkima", kusjuures sisuliselt viiakse läbi kaks tegevust:

- mitmed väikesed failid ühendatakse kokku (arhiveerimine)
- see kokkuühendatud fail teisendatakse nii ümber, et tema maht väheneb (kompresseerimine)

Niisiis, failide nö. kokku pakkimise mõte on omada endiselt kõnelaust informatsiooni kusjuures kulutada selle hoidmiseks vähem resurssi (nt. kõvaketta pinda). Info mis oli enne kokkupakkimist programmidele kasutatav ei ole enam vahetult kasutatav. Et seda jälle kasutada tuleb ta eelnevalt lahti pakkida.

Siit tekib muidugi küsimus, et kui meil on näiteks 40 MB  paljude väikeste failide kujul juttu ja selle kokkupakkides väheneb ta maht 4 MB-ni; miks mitte teda siis veel kokku pakkida ja saada 0,4 MB ja äkki veel ja veel nii, et kogu info on pärast 1 B -s (veep parem 1 bitis kirjas)?
Sisuliselt on see muidugi absurdne :)
 

2. Arhiveerimise ja kompresseerimise idee ja praktika: tar ja gzip

Olgu meil kolm faili:

bash# ls
-rw-r--r--   1 root     root           13 Aug 10 09:42 konsonandid
-rw-r--r--   1 root     root           17 Aug 10 09:42 nasaalid
-rw-r--r--   1 root     root           12 Aug 10 09:42 vokaalid

vokaalid:

aaaaaaaaiiiiiiii

konsonandid:

kkkkkkkkgggggggg

nasaalid:

mmmmmmmmnnnnnnnn

peale arhiveerimist

bash# tar cvf tähed.tar vokaalid konsaonandid nasaalid
bash# ls -l
-rw-r--r--   1 root     root           13 Aug 10 09:42 konsonandid
-rw-r--r--   1 root     root           17 Aug 10 09:42 nasaalid
-rw-r--r--   1 root     root        10240 Aug 10 09:43 tähed.tar
-rw-r--r--   1 root     root           12 Aug 10 09:42 vokaalid
bash#

saame uue faili

tähed.tar:

bash#cat tähed
vokaalid100644      0      0          14  6563603320  10610 0ustar  rootrootaaaaaaaaaaa
konsonandid100644      0      0          15  6563603334  11333 0ustar  rootrootkkkkkkkkkkkk
nasaalid100644      0      0          21  6563603345  10577 0ustar  rootrootmmmmmmmmmmmmmmmm
bash#

No see fail on küll suurem kui liidetavate summa oleks. Seal sees on:

- faiilde nimed
- õigused (100644)
- omaniku ja grupi andmed
- sisu

kompresseerimine teeb midagi sellist, põhimõtteliselt:

originaal:

oooooaaaabbbbcccc

peale pakkimist:

4o4a4b4c
 
ja suurus poole väiksem!

Praktiliselt tuleb anda käsk:

bash# gzip tähed.tar
bash# ls -l
-rw-r--r--   1 root     root           13 Aug 10 09:42 konsonandid
-rw-r--r--   1 root     root           17 Aug 10 09:42 nasaalid
-rw-r--r--   1 root     root          182 Aug 10 09:43 tähed.tar.gz
-rw-r--r--   1 root     root           12 Aug 10 09:42 vokaalid
bash# rm konsonandid nasaalid vokaalid

Noo nii ja siin on kurb tunnistus, et väikesi faile kokku pakkida ei maksa :(

Lahtipakkimine:

bash# ls
-rw-r--r--   1 root     root          182 Aug 10 09:43 tähed.tar.gz
bash# gzip -d tähed
-rw-r--r--   1 root     root          182 Aug 10 09:43 tähed.tar
bash# tar xvf tähed
bash#ls
-rw-r--r--   1 root     root           13 Aug 10 09:42 konsonandid
-rw-r--r--   1 root     root           17 Aug 10 09:42 nasaalid
-rw-r--r--   1 root     root          182 Aug 10 09:43 tähed.tar
-rw-r--r--   1 root     root           12 Aug 10 09:42 vokaalid
 

3. tar zxvf, tar zcvf

Eelmine punkt oli eihk liiga paljusõnaline, sestap toon siin ära mõned faktid:

- enne kokupakkimist on normaalne koondada küik kraam ühte kataloogi (võib olla mitmetasemeline)
- tar -il on laiendist .tar ükskõik aga gzip-il ei ole - laiend peab olema .gz.
- tar ega gzip ei võimalda teha nn. volume'id nt. 1 440 kB suuruseid tükke; selleks on split ja cat
- kasutage käsku 'tar zcvf arh.nimi.tgz *' kokkupakkimiseks, nii teeb ta ka gzip-i ära.
- kasutage käsku tar zxvf arh.nimi.tgz lahtipakkimiseks, nii teeb ta gzip -d ära.
- kui teil on fail arh.tar.gz siis võib teha nii: bash# mv arh.tar.gz arh.tgz; tar zxvf arh.tgz
- saab arhiivis sisaduvate failide nimekirja: tar -ztf isikud.tar.gz

 
4. Tykkideks tegemine

Olgu meil olemas piisavalt suur (so. mõni MB) fail isikud.tar.gz; toimetage isikud.tar.gz eraldi kataloogi ja andke korraldus:

split -b 1000 isikud.tar.gz

ning tulemusena peaks kataloogi tekkima faile selliste nimedega: xaa, xab, .. , xaz, xba, ..

tykkide kokkuyhendamine:

seda saab teha cat kasuga:

cat  *  >  isikud.tar.gz

kui ls'i default parameetreid mitte puutuda saab ta nad kokku õiges järjekorras (selleks on tähestikuline järjekord)

5. Data kontrollimine

Ikka ja jälle on kahtlusi selles suhtes kas info transpordil ei läinud mõni oluline bitikene kaotsi. Selleks on olemas linuxis spetsiaalsed vahaendid:

1. cmp compare two files - kahe faili võrdlemine

cmp esimene teine

2. diff - kahe faili või kataloogitäie võrdlemine

diff -r kataloog1 kataloog2

3. kaval on enne ja peale suuremaid kopeerimisi kasutada ka cksum programmi:

Ta arvutad iga faili jaoks välja nn. CRC arvu ja neid tulebki enne ja pärast võrrelda.

bash# cksum failinimi
32343566 545 failinimi

esimene on see CRC, teine faili suurus ja viimane faili nimi