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
.