5. Arhive¶
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:
Să avem o ierarhie de fișiere și directoare într-un singur fișier - Arhivare. De exemplu, vrem să trimitem pe mail o ierarhie de directoare cu laboratoarele și resursele materiei USO.
Ne dorim ca fișierele să ocupe mai puțin spațiu - Compresie.
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ă.
5.1. Arhivare - tar¶
5.1.1. Crearea arhivelor¶
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 înregistrare_lab01.mov
, înregistrare_lab02.mov
, înregistrare_lab03.mov
numită înregistrări.tar
folosind utilitarul tar
:
student@uso:~$ ls -lh
total 9.0M
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1.0M Aug 19 11:55 înregistrare_lab03.mov
student@uso:~$ tar cvf înregistrări.tar înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
student@uso:~$ ls -lh
total 19M
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1.0M Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 9.1M Aug 19 11:56 înregistrări.tar
Observăm cum după comanda de creare a arhivei tar am verificat corectitudinea operației.
Avem acum în directorul curent arhiva înregistrări.tar
.
Având trei fișiere pe care vrem să le arhivăm, folosim utilitarul tar
împreună cu parametrii următori:
c: creează arhiva;
v: afișează detalii despre operație (verbose);
f: folosește arhiva dată ca parametru (în cazul de față, numele ei).
Arhiva nou creată ocupă 9.1 MB. Fișierele ce compun arhiva ocupă 5M, 3M respectiv 1M.
Fișierul de tipul tar nou creat nu ocupă mai puțin spațiu; din contră, ocupă mai mult spațiu din cauza metadatelor 1 fișierului.
Verificăm tipul fișierului folosind utilitarul file
.
student@uso:~$ file înregistrări.tar
înregistrări.tar: POSIX tar archive (GNU)
Fișierul înregistrări.tar
este o arhivă de tip tar.
5.1.1.1. Exerciții - creare arhive¶
Creați 3 fișiere noi care să conțină pe rând numele, prenumele și anul vostru de naștere.
Creați o arhivă de tipul tar care să conțină cele trei fișiere și care să aibă numele
personal_data.tar
.Verificați corectitudinea operațiilor.
Afișați dimensiunea arhivei.
Verificați că fișierul nou creat este o arhivă tar.
Creați o arhivă a fișierelor din interiorul directorului
/usr/include/net/
cu numelenet.tar
.Verificați corectitudinea operației.
Afișați dimensiunea arhivei.
Verificați că fișierul nou creat este o arhivă tar.
5.1.2. Afișarea conținutului arhivelor¶
Pentru ușurința de stocare și transmitere, un coleg ne-a transmis toate înregistrările 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:~$ tar tf înregistrări.tar
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
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.
5.1.2.1. Exercițiu - afișarea conținutului unei arhive¶
Afișați conținutul arhivelor create la exercițiul anterior
personal_data.tar
șinet.tar
fără dezarhivare.
5.1.3. Extragerea arhivelor¶
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 înregistrare_lab01.mov
, înregistrare_lab02.mov
, înregistrare_lab03.mov
, adică fișierele care se află în arhiva înregistrări.tar
.
student@uso:~$ rm înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov
student@uso:~$ ls
înregistrări.tar
Am verificat că fișierele nu mai există.
În continuare extragem fișierele din arhivă folosind tar
:
student@uso:~$ tar xvf înregistrări.tar
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
student@uso:~$ ls -lh
total 19M
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1.0M Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 9.1M Aug 19 12:04 înregistrări.tar
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).
5.1.4. Extragerea arhivelor la o cale specifică¶
Avem următorul scenariu: am descărcat scheletul de temă de la facultate, acesta se află în directorul ~/Downloads
, iar noi vrem să îl dezarhivăm în directorul ~/facultate/uso/teme/
.
Sau am descărcat în ~/Downloads/
de la un prieten o arhivă cu înregistrările video ale laboratoarelor.
Vrem să le dezarhivăm în directorul ~/facultate/uso/laboratoare/video/
.
Creăm un director dezarhivare/tar
și extragem arhiva acolo folosind tar
:
student@uso:~$ ls -l
total 18436
-rw-r--r-- 1 student student 5242880 Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3145728 Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1048576 Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 9439088 Aug 19 12:04 înregistrări.tar
student@uso:~$ mkdir -p dezarhivare/tar
student@uso:~$ tree
.
|-- dezarhivare
| ``-- tar
|-- înregistrare_lab01.mov
|-- înregistrare_lab02.mov
|-- înregistrare_lab03.mov
``-- înregistrări.tar
2 directories, 4 files
student@uso:~$ tar xvf înregistrări.tar --directory dezarhivare/tar/
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
student@uso:~$ tree
.
|-- dezarhivare
| ``-- tar
| |-- înregistrare_lab01.mov
| |-- înregistrare_lab02.mov
| ``-- înregistrare_lab03.mov
|-- înregistrare_lab01.mov
|-- înregistrare_lab02.mov
|-- înregistrare_lab03.mov
``-- înregistrări.tar
2 directories, 7 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:~$ rm înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov
student@uso:~$ ls
dezarhivare înregistrări.tar
student@uso:~$ tar xvf înregistrări.tar înregistrare_lab01.mov
înregistrare_lab01.mov
student@uso:~$ ls -l
total 14344
drwxr-xr-x 3 student student 4096 Aug 19 12:15 dezarhivare
-rw-r--r-- 1 student student 5242880 Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 9439088 Aug 19 12:04 înregistrări.tar
Am extras doar fișierul înregistrare_lab01.mov
din arhiva înregistrări.tar
.
Note
Obervăm cum după comenzile de ștergere și dezarhivare am verificat corectitudinea operațiilor. Este extrem de util acest lucru.
Am pus ca ultim parametru numele fișierului (înregistrare_lab01.mov
).
5.1.4.1. Exerciții - extragerea (dezarhivarea) unei arhive¶
Creați un director cu numele
personal
și în acest director încă unul cu numeledocumente
ca în ierarhia de mai sus.Extrageți arhiva
personal_data.tar
în directorulpersonal/documente/
.Extrageți doar fișierul
nume
în directorul curent.Verificați corectitudinea operațiilor afișând conținutul arhivei și directoarelor după dezarhivare.
Extrageți arhiva
net.tar
în directorul/tmp/
.Verificați corectitudinea operațiilor afișând conținutul arhivei și directorului după dezarhivare.
5.1.5. Adăugarea de noi fișiere la arhive¶
Adăugăm un nou fișier la arhivă folosind comanda tar
, astfel:
student@uso:~$ tar -tf înregistrări.tar
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
student@uso:~$ tar rvf înregistrări.tar înregistrare_lab04.mov
înregistrare_lab04.mov
student@uso:~$ tar tf înregistrări.tar
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
înregistrare_lab04.mov
În primă fază am verificat că înregistrare_lab04.mov
nu există în arhivă.
În continuare am adăugat înregistrare_lab04.mov
la arhivă folosind optiunea r
.
Note
Observăm cum după comanda de adăugare de fișier la arhivă, am verificat corectitudinea operației.
5.1.5.1. Exerciții - adăugare de noi fișiere¶
Creați un fișier
UPB
; verificați operația afișând conținutul directorului părinte;Adăugați textul Make UPB Great Again! în interiorul fișierului; verificați operația afișând conținutul fișierului;
Adăugați-l la arhiva
personal_data.tar
, ca în exemplul de mai sus; verificați operația afișând conținutul arhivei.
5.1.6. Comprimare tar.gz
¶
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:~$ tar -czvf inregistrari.tar.gz inregistrare_lab01.mov inregistrare_lab02.mov inregistrare_lab03.mov
inregistrare_lab01.mov
inregistrare_lab02.mov
inregistrare_lab03.mov
student@uso:~$ ls -l
-rw-r--r-- 1 student student 9441280 Sep 29 04:51 inregistrari.tar
-rw-r--r-- 1 student student 9439133 Oct 12 18:55 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
.
5.2. Comprimare - zip
¶
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 Arhivare - tar, unde am folosit utilitarul tar
.
5.2.1. Crearea arhivelor¶
Putem crea o arhivă folosind utilitarul zip
, astfel:
student@uso:~$ zip înregistrări.zip înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov
adding: înregistrare_lab01.mov (deflated 0%)
adding: înregistrare_lab02.mov (deflated 0%)
adding: înregistrare_lab03.mov (deflated 0%)
student@uso:~$ ls -lh
total 26M
drwxr-xr-x 3 student student 4.0K Aug 19 12:15 dezarhivare
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1.0M Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 7.0M Aug 19 12:35 înregistrare_lab04.mov
-rw-r--r-- 1 student student 9.1M Aug 19 17:56 înregistrări.tar
-rw-r--r-- 1 student student 9.1M Aug 19 17:54 înregistrări.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 vedeam afișarea dimensiuni în format human-readable adică în MegaBytes (MegaOcteți). Afișăm dimesniunea în octeți:
student@uso:~$ ls -l
-rw-r--r-- 1 student student 9441280 Sep 29 04:51 înregistrări.tar
-rw-r--r-- 1 student student 9439072 Sep 29 04:51 înregistrări.zip
Arhiva tar
are 9441280 octeți, iar arhiva zip
are 9439072.
Observăm o mică diferență între cele două, varianta zip
fiind mai mică.
Mergem mai departe cu un experiment.
Facem arhivare și comprimare a ierarhiei de directoare /usr/bin
și comparăm dimensiunea:
student@uso:~$ ls -l
-rw-r--r-- 1 student student 100679680 Sep 29 04:46 usr_bin.tar
-rw-r--r-- 1 student student 87282498 Sep 29 04:46 usr_bin.zip
student@uso:~$ ls -lh
-rw-r--r-- 1 student student 97M Sep 29 04:46 usr_bin.tar
-rw-r--r-- 1 student student 84M Sep 29 04:46 usr_bin.zip
Observăm deja o diferență mai mare de dimensiune între cele două.
Note
Pentru o mai bună înțelegere a comenzii de creare a arhivelor, inspectați manualul: man zip
.
5.2.1.1. Exerciții - creare arhive¶
Creați 3 fișiere noi care să conțină pe rând orașul natal, țara natală și liceul absolvit; verificați crearea fișierelor afișând conținutul directorului părinte.
Creați o arhivă de tipul
zip
care să conțină cele trei fișiere și care să aibă numelepersonal_data.zip
; verificați conținutul arhivei.Afișați dimensiunea arhivei.
Creați o arhivă de tipul
zip
a fișierelor din interiorul directorului/usr/include/net/
cu numelenet.zip
.Comparați dimensiunea arhivei
zip
cu ceatar
de la exercițiu precendent.
5.2.2. Afișarea conținutului arhivelor¶
Putem vizualiza conținutul arhivei astfel:
student@uso:~$ zip -sf înregistrări.zip
Archive contains:
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
Pentru a vizualiza arhiva fără dezarhivare folosim opțiunea -sf
(prescurtare de la show-files).
5.2.2.1. Exerciții - afișarea conținutului unei arhivei¶
Acest exercițiu folosește arhiva creată la exercițiu anterior.
Afișați conținutul arhivelor
personal_data.zip
șinet.zip
fără dezarhivare.
5.2.3. Dezarhivarea arhivelor¶
Î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 înregistrare_lab01.mov
, înregistrare_lab02.mov
, înregistrare_lab03.mov
, adică fișierele care se află în arhiva înregistrări.zip.
student@uso:~$ ls -l
total 29708
drwxr-xr-x 3 student student 4096 Aug 19 12:15 dezarhivare
-rw-r--r-- 1 student student 5242880 Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3145728 Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1048576 Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 7340032 Aug 19 12:35 înregistrare_lab04.mov
-rw-r--r-- 1 student student 9441280 Aug 19 17:56 înregistrări.tar
-rw-r--r-- 1 student student 4195250 Aug 19 18:00 înregistrări.zip
student@uso:~$ rm înregistrări.zip
În primă instanță, ștergem arhiva înregistrări.zip
.
În continuare, recreăm arhiva înregistrări.zip
și ștergem fișierele înregistrare_lab01.mov
, înregistrare_lab02.mov
, înregistrare_lab03.mov
:
În momentul de față avem doar arhiva zip și urmează să obținem fișierele cu înregistrari, folosind utilitarul zip
:
Note
Observăm cum după operațiile de ștergere și dezarhivare, verificăm corectitudinea operațiilor.
Pentru a dezarhiva o arhivă folosim utilitarul unzip
.
Observați că am șters fișierele existente înainte de extragere.
Putem extrage fișierele către o anumită cale:
student@uso:~$ mkdir dezarhivare/zip
student@uso:~$ unzip înregistrări.zip -d dezarhivare/zip/
Archive: înregistrări.zip
inflating: dezarhivare/zip/înregistrare_lab01.mov
inflating: dezarhivare/zip/înregistrare_lab02.mov
inflating: dezarhivare/zip/înregistrare_lab03.mov
student@uso:~$ tree
.
|-- dezarhivare
| |-- tar
| ``-- zip
| |-- înregistrare_lab01.mov
| |-- înregistrare_lab02.mov
| ``-- înregistrare_lab03.mov
|-- înregistrare_lab01.mov
|-- înregistrare_lab02.mov
|-- înregistrare_lab03.mov
|-- înregistrare_lab04.mov
|-- înregistrări.tar
``-- înregistrări.zip
3 directories, 9 files
Note
Observăm că după crearea directoarelor și după extragerea arhivelor am verificat corectitudinea operațiilor.
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:~$ rm înregistrare_lab03.mov
student@uso:~$ ls -lh
total 34M
drwxr-xr-x 4 student student 4.0K Aug 19 18:05 dezarhivare
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 7.0M Aug 19 12:35 înregistrare_lab04.mov
-rw-r--r-- 1 student student 9.1M Aug 19 17:56 înregistrări.tar
-rw-r--r-- 1 student student 9.1M Aug 19 18:02 înregistrări.zip
student@uso:~$ unzip înregistrări.zip înregistrare_lab03.mov
Archive: înregistrări.zip
inflating: înregistrare_lab03.mov
student@uso:~$ ls -lh
total 35M
drwxr-xr-x 4 student student 4.0K Aug 19 18:05 dezarhivare
-rw-r--r-- 1 student student 5.0M Aug 19 11:55 înregistrare_lab01.mov
-rw-r--r-- 1 student student 3.0M Aug 19 11:55 înregistrare_lab02.mov
-rw-r--r-- 1 student student 1.0M Aug 19 11:55 înregistrare_lab03.mov
-rw-r--r-- 1 student student 7.0M Aug 19 12:35 înregistrare_lab04.mov
-rw-r--r-- 1 student student 9.1M Aug 19 17:56 înregistrări.tar
-rw-r--r-- 1 student student 9.1M Aug 19 18:02 înregistrări.zip
Note
Obervăm cum după comenzile de ștergere și dezarhivare s-a verificat corectitudinea operațiilor.
Puteți observa că am extras un singur fișier punând ca ultim parametru numele fișierului.
5.2.3.1. Exerciții - dezarhivarea unei arhive¶
Creați un director cu numele
zip
în directoruluidezarhivare
ca în ierarhia de mai sus; verificați crearea afișând conținutul directoruluidezarhivare
.Dezarhivați arhiva
personal_data.zip
în directoruldezarhivare/zip/
; verificați operația de dezarhivare afișând conținutul directorului.Dezarhivați doar fișierul oraș natal în directorul curent; verificați operația afișând conținutul directorului curent.
Creați directorul
my_net
în directoruldezarhivare
ca în ierarhia de mai sus; verificați crearea afișând conținutul directoruluidezarhivare
.Dezarhivați arhiva
net.zip
în directorul creat anteriormy_net
; verificați operația de dezarhivare afișând conținutul directorului.
5.2.4. Adăugarea de noi fișiere la arhive¶
Putem adăuga un nou fișier la arhivă folosind comanda zip -u
:
student@uso:~$ zip -u înregistrări.zip înregistrare_lab04.mov
adding: înregistrare_lab04.mov (deflated 0%)
student@uso:~$ zip -sf înregistrări.zip
Archive contains:
înregistrare_lab01.mov
înregistrare_lab02.mov
înregistrare_lab03.mov
înregistrare_lab04.mov
Total 4 entries (16777216 bytes)
Note
Observăm cum după comanda de adăugare de fișier la arhivă, am verificat corectitudinea operației folosind comanda zip -sf
.
În exemplul de mai sus am adăugat înregistrare_lab04.mov
la arhivă.
5.2.4.1. Exerciții - adăugarea unui fișier în arhivă¶
Creați un fișier
UPB
cu conținutul “Make UPB Great Again!”;Verificați conținutul arhivei
personal_data.zip
;Adăugați fișierul
UPB
în arhivă;Verificați adăugarea fișierului la arhivă fără dezarhivare;
Dezarhivați arhiva în directorul
personal_data_zip
.
- 1
Metadatele sunt modalitatea sistemului de fișiere de a reține informații despre acesta: data creării, dimensiunea, utilizatorul ce deține fișierul, etc.