Sunt situații în care vrem să trimitem/stocăm o ierarhie de fișiere. Pentru a ușura acest lucru, folosim arhive. Arhivele sunt o concatenare a unei ierarhii de fișiere și directoare într-un singur fișier.
Există două motive pentru care am vrea să folosim arhive:
Comprimarea este o arhivare mai specială pentru că micșorează dimensiunea fișierului rezultat. Rezultatul este similar: agregarea într-un singur fișier.
În acest capitol vom folosi arhive de tipul zip și tar. Vom folosi tar pentru arhivare și zip pentru arhivare comprimată.
Arhivele sunt utile atunci când vrem să trimitem pe mail sau să încărcăm pe un site o ierarhie de fișiere și directoare. Pe scurt, atunci când vrem să agregăm totul într-un singur fișier. Acesta poate fi transmis foarte ușor și ulterior dezarhivat.
Creăm o arhivă cu fișierele inregistrare_lab01.mp4, inregistrare_lab02.mp4, inregistrare_lab03.mp4 numită inregistrari.tar folosind utilitarul tar:
student@uso:~$ cd ~/archive student@uso:~/archive$ ls -lh total 15M -rw-r--r-- 1 student student 6.8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2.5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4.8M oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4 student@uso:~/archive$ tar cvf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls -lh total 19M -rw-r--r-- 1 student student 14M oct 13 23:39 inregistrari.tar -rw-r--r-- 1 student student 6.8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2.5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4.8M oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4
Observăm cum după comanda de creare a arhivei tar am verificat corectitudinea operației. Avem acum în directorul curent arhiva inregistrari.tar.
Având trei fișiere pe care vrem să le arhivăm, folosim utilitarul tar împreună cu parametrii următori:
Arhiva nou creată ocupă 14 MB. Fișierele ce compun arhiva ocupă 6.8MB, 2.5MB respectiv 4.8MB.
Fișierul de tipul tar nou creat nu ocupă mai puțin spațiu; din contră, ocupă mai mult spațiu din cauza metadatelor1) fișierului.
Verificăm tipul fișierului folosind utilitarul file.
student@uso:~/archive$ file inregistrari.tar inregistrari.tar: POSIX tar archive (GNU)
Fișierul inregistrari.tar este o arhivă de tip tar.
personal_data.tar./usr/include/net/ cu numele net.tar. HINT: Folosiți sudo!Pentru ușurința de stocare și transmitere, un coleg ne-a transmis toate inregistrarile laboratoarelor filmate de el, într-o arhivă. Noi vrem să vedem conținutul acestei arhive. Putem să vedem ce fișiere conține, fără a o deschide.
Facem acest lucru folosind utilitarul tar:
student@uso:~/archive$ tar tf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4
Pentru a vizualiza arhiva fără dezarhivare am folosit opțiunea t. Folosim opțiunea f pentru a specifica ce arhivă vrem să afișăm.
personal_data.tar și net.tar fără dezarhivare.Dezarhivarea este procesul opus al arhivării. Avem deja o arhivă de tip tar și vrem să extragem ierarhia din ea.
În momentul în care dezarhivăm un fișier de tip tar, fișierele din cadrul arhivei vor fi create în directorul curent (dacă nu se specifică altfel). Cu alte cuvinte, ierarhia de fișiere pe care am arhivat-o se păstrează, iar în momentul dezarhivării aceasta va arăta la fel ca înainte de arhivare. Pentru a vedea mai clar efectul operației de dezarhivare, ștergem fișierele inregistrare_lab01.mp4, inregistrare_lab02.mp4, inregistrare_lab03.mp4, adică fișierele care se află în arhiva inregistrari.tar.
student@uso:~/archive$ rm inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls inregistrari.tar inregistrare_lab04.mp4
Am verificat că fișierele nu mai există.
În continuare extragem fișierele din arhivă folosind tar:
student@uso:~/archive$ tar xvf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls -lh total 29M -rw-rw-r-- 1 student student 14M oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 6,8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2,5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4,8M oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4
Pentru dezarhivare am folosit următorii parametrii ai utiliitarului tar:
x: extrage arhiva (extract);v: afișează detalii despre operație (verbose);f: folosește arhiva dată ca parametru (în cazul de față, numele ei).
Avem următorul scenariu: am descărcat în ~/archive de la un prieten o arhivă cu inregistrarile video ale laboratoarelor. Vrem să le dezarhivăm în directorul ~/archive/dezarhivare/tar.
Creăm un director dezarhivare/tar și extragem arhiva acolo folosind tar:
student@uso:~/archive$ ls -l total 28808 -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 7032579 oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2528132 oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4979963 oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 399418 oct 11 02:23 inregistrare_lab04.mp4 student@uso:~/archive$ mkdir -p dezarhivare/tar student@uso:~/archive$ tree . |-- dezarhivare | ``-- tar |-- inregistrare_lab01.mp4 |-- inregistrare_lab02.mp4 |-- inregistrare_lab03.mp4 |-- inregistrare_lab04.mp4 ``-- inregistrari.tar 2 directories, 5 files student@uso:~/archive$ tar xvf inregistrari.tar --directory dezarhivare/tar/ inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ tree . |-- dezarhivare | ``-- tar | |-- inregistrare_lab01.mp4 | |-- inregistrare_lab02.mp4 | ``-- inregistrare_lab03.mp4 |-- inregistrare_lab01.mp4 |-- inregistrare_lab02.mp4 |-- inregistrare_lab03.mp4 |-- inregistrare_lab04.mp4 ``-- inregistrari.tar 2 directories, 8 files
Observăm că după crearea directoarelor și după extragerea arhivelor am verificat corectitudinea operațiilor.
După cum observăm în exemplu de mai sus, pentru a extrage fișierele către o anumită cale, folosim opțiunea --directory (- - d i r e c t o r y):
Putem extrage un singur fișier fără să fim obligați să dezarhivăm tot, folosind comanda tar xvf astfel:
student@uso:~/archive$ rm inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls dezarhivare inregistrari.tar inregistrare_lab04.mp4 student@uso:~/archive$ tar xvf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab01.mp4 student@uso:~/archive$ ls -l total 14344 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 7032579 oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 399418 oct 11 02:23 inregistrare_lab04.mp4
Am extras doar fișierul inregistrare_lab01.mp4 din arhiva inregistrari.tar.
Am pus ca ultim parametru numele fișierului (inregistrare_lab01.mp4).
personal și în acest director încă unul cu numele documente ca în ierarhia de mai sus.personal_data.tar în directorul personal/documente/.nume în directorul curent.net.tar în directorul /tmp/.
Adăugăm un nou fișier la arhivă folosind comanda tar, astfel:
student@uso:~/archive$ tar -tf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ tar rvf inregistrari.tar inregistrare_lab04.mp4 inregistrare_lab04.mp4 student@uso:~/archive$ tar tf inregistrari.tar inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 inregistrare_lab04.mp4
În primă fază am verificat că inregistrare_lab04.mp4 nu există în arhivă. În continuare am adăugat inregistrare_lab04.mp4 la arhivă folosind opțiunea r.
UPB. Verificați operația afișând conținutul directorului părinte.personal_data.tar, ca în exemplul de mai sus. Verificați operația afișând conținutul arhivei.
Am văzut mai sus că pentru a pune o ierarhie de fișiere într-unul singur, folosim tar. Pentru a reduce dimensiunea arhivei folosim utilitarul tar astfel:
student@uso:~/archive$ tar xvf inregistrari.tar inregistrare_lab02.mp4 inregistrare_lab03.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ tar -czvf inregistrari.tar.gz inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls -l -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-rw-r-- 1 student student 14516779 oct 14 00:00 inregistrari.tar.gz ...
Am folosit următorii parametrii:
c: creează arhiva;z: pentru arhivare gzip;v: afișează detalii despre operație (verbose);f: folosește arhiva dată ca parametru (în cazul de față, numele ei).
Observăm că dimensiunea arhivei comprimate inregistrari.tar.gz a scăzut față de arhiva originală inregistrari.tar.
Acțiunea de comprimare este compusă din doi pași: arhivare și reducerea dimensiunii (comprimare). Utilitarul zip face ambii pași simultan.
În continuare folosim utilitarul zip pentru arhivare și comprimare. Arhivarea este similară cu cea prezentată în subsecțiunea arhiva_tar, unde am folosit utilitarul tar.
Putem crea o arhivă folosind utilitarul zip, astfel:
student@uso:~/archive$ zip inregistrari.zip inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 adding: inregistrare_lab01.mp4 (deflated 0%) adding: inregistrare_lab02.mp4 (deflated 0%) adding: inregistrare_lab03.mp4 (deflated 0%) student@uso:~/archive$ ls -lh total 56M drwxr-xr-x 3 student student 4.0K oct 11 12:15 dezarhivare -rw-rw-r-- 1 student student 14M oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 6,8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2,5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4,8M oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4 -rw-rw-r-- 1 student student 14M oct 14 00:00 inregistrari.tar.gz -rw-rw-r-- 1 student student 14M oct 14 00:11 inregistrari.zip
Sintaxa este în felul următor: zip numele_arhivă.zip ierarhia_de_fișiere Observăm cum după comanda de creare a arhivei zip am verificat corectitudinea operației.
Parametrul -h de la comanda ls -lh transformă dimensiunea fișierului în format human-readable, adică folosește K pentru KiloOcteți, M pentru MegaOcteți, G pentru GigaOcteți. La prima vedere, folosind comanda ls -lh observăm că fișierul de tipul zip nou creat nu ocupă mai puțin spațiu decât suma dimensiunilor celor trei fișiere. Motivul este că în sistemul de fișiere a apărut un nou fișier ce conține arhiva nou creată și sistemul de fișiere stochează informații despre acest fișier. Exemplu de informații stocate: dimensiune, data creare, permisiuni, utilizatorul deținător.
Observăm că dimensiunea arhivei tar este aceeași cu aceea a arhivei zip. De fapt, dacă ne uităm în detaliu, vom vedea că nu este așa.
Mai sus afișarea dimensiunii este în format human-readable adică în MegaBytes (MegaOcteți). Afișăm dimensiunea în octeți:
student@uso:~/archive$ ls -l -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-rw-r-- 1 student student 14517242 oct 14 00:11 inregistrari.zip ...
Arhiva tar are 14551040 octeți, iar arhiva zip are 14517242. Observăm o mică diferență între cele două, varianta zip fiind mai mică.
man zip.
zip care să conțină cele trei fișiere și care să aibă numele personal_data.zip. Verificați conținutul arhivei.zip a fișierelor din interiorul directorului /usr/include/net/ cu numele net.zip.zip cu cea tar de la exercițiu precendent.Putem vizualiza conținutul arhivei astfel:
student@uso:~/archive$ zip -sf inregistrari.zip Archive contains: inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4
Pentru a vizualiza arhiva fără dezarhivare folosim opțiunea -sf (prescurtare de la show-files).
personal_data.zip și net.zip fără dezarhivare.
În momentul în care dezarhivăm un fișier de tip zip, fișierele din cadrul arhivei vor fi create în directorul curent (dacă nu se specifică altfel). Cu alte cuvinte, ierarhia de fișiere pe care am arhivat-o se păstrează, iar în momentul dezarhivării aceasta va arăta la fel ca înainte de arhivare. Pentru a vedea mai clar efectul operației de dezarhivare, ștergem fișierele inregistrare_lab01.mp4, inregistrare_lab02.mp4, inregistrare_lab03.mp4, adică fișierele care se află în arhiva inregistrari.zip.
student@uso:~/archive$ ls -l total 57168 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-rw-r-- 1 student student 14164824 oct 13 23:39 inregistari.tar.gz -rw-r--r-- 1 student student 7032579 oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2528132 oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4979963 oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 399418 oct 11 02:23 inregistrare_lab04.mp4 -rw-rw-r-- 1 student student 14517242 oct 14 00:11 inregistrari.zip student@uso:~/archive$ rm inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 student@uso:~/archive$ ls -l total 34828 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -rw-r--r-- 1 student student 7340032 oct 11 12:35 inregistrare_lab04.mp4 -rw-r--r-- 1 student student 9441280 oct 11 17:56 inregistrari.tar -rw-r--r-- 1 student student 9406659 oct 11 17:56 inregistrari.tar.gz -rw-r--r-- 1 student student 9439072 oct 11 18:02 inregistrari.zip
Pentru a dezarhiva o arhivă folosim utilitarul unzip. Puteți observa că am șters fișierele existente înainte de extragere.
student@uso:~/archive$ unzip inregistrari.zip Archive: inregistrari.zip inflating: inregistrare_lab01.mp4 inflating: inregistrare_lab02.mp4 inflating: inregistrare_lab03.mp4 student@uso:~/archive$ ls -l total 57168 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -rw-rw-r-- 1 student student 14551040 oct 13 23:39 inregistari.tar -rw-rw-r-- 1 student student 14164824 oct 13 23:39 inregistari.tar.gz -rw-r--r-- 1 student student 7032579 oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2528132 oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4979963 oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 399418 oct 11 02:23 inregistrare_lab04.mp4 -rw-rw-r-- 1 student student 14517242 oct 14 00:11 inregistrari.zip
Putem extrage fișierele către o anumită cale:
student@uso:~/archive$ mkdir dezarhivare/zip student@uso:~/archive$ unzip inregistrari.zip -d dezarhivare/zip/ Archive: inregistrari.zip inflating: dezarhivare/zip/inregistrare_lab01.mp4 inflating: dezarhivare/zip/inregistrare_lab02.mp4 inflating: dezarhivare/zip/inregistrare_lab03.mp4 student@uso:~/archive$ tree . |-- dezarhivare | |-- tar | |-- inregistrare_lab01.mp4 | |-- inregistrare_lab02.mp4 | ``-- inregistrare_lab03.mp4 | ``-- zip | |-- inregistrare_lab01.mp4 | |-- inregistrare_lab02.mp4 | ``-- inregistrare_lab03.mp4 |-- inregistrare_lab01.mp4 |-- inregistrare_lab02.mp4 |-- inregistrare_lab03.mp4 |-- inregistrare_lab04.mp4 |-- inregistrari.tar |-- inregistrari.tar.gz ``-- inregistrari.zip 3 directories, 13 files
Am folosit comanda unzip -d destinație pentru a extrage o arhivă zip la calea destinație.
Putem dezarhiva un singur fișier/director din toată arhiva:
student@uso:~/archive$ rm inregistrare_lab03.mp4 student@uso:~/archive$ ls -lh total 48M drwxr-xr-x 4 student student 4.0K oct 11 18:05 dezarhivare -rw-rw-r-- 1 student student 14M oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 6,8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2,5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4 -rw-rw-r-- 1 student student 14M oct 14 00:11 inregistrari.zip student@uso:~/archive$ unzip inregistrari.zip inregistrare_lab03.mp4 Archive: inregistrari.zip inflating: inregistrare_lab03.mp4 student@uso:~/archive$ ls -lh drwxr-xr-x 4 student student 4.0K oct 11 18:05 dezarhivare -rw-rw-r-- 1 student student 14M oct 13 23:39 inregistari.tar -rw-r--r-- 1 student student 6,8M oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 2,5M oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 4,8M oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 391K oct 11 02:23 inregistrare_lab04.mp4 -rw-rw-r-- 1 student student 14M oct 14 00:11 inregistrari.zip
Puteți observa că am extras un singur fișier punând ca ultim parametru numele fișierului.
zip în directorul dezarhivare ca în ierarhia de mai sus. Verificați crearea afișând conținutul directorului dezarhivare.personal_data.zip în directorul dezarhivare/zip/. Verificați operația de dezarhivare afișând conținutul directorului.oraș natal în directorul curent. Verificați operația afișând conținutul directorului curent.my_net în directorul dezarhivare ca în ierarhia de mai sus. Verificați crearea afișând conținutul directorului dezarhivare.net.zip în directorul creat anterior my_net. Verificați operația de dezarhivare afișând conținutul directorului.
Putem adăuga un nou fișier la arhivă folosind comanda zip -u:
student@uso:~/archive$ zip -u inregistrari.zip inregistrare_lab04.mp4 adding: inregistrare_lab04.mp4 (deflated 0%) student@uso:~/archive$ zip -sf inregistrari.zip Archive contains: inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4 inregistrare_lab04.mp4 Total 4 entries (16777216 bytes)
zip -sf.
În exemplul de mai sus am adăugat inregistrare_lab04.mp4 la arhivă.
UPB cu conținutul “Make UPB Great Again!”.personal_data.zip.UPB în arhivă.personal_data_zip.