=== Elemente de bază pentru gestiunea fișierelor ===
==== Cheatsheet ====
^ Comandă ^ Descriere ^
| **''.''** | directorul curent |
| **''..''** | directorul părinte |
| **''cd''** | schimbă directorul curent |
| **''cp''** | copiază un fișiere sau director dintr-o locație în alta |
| **''stat''** | afișează statistici fișier |
| **''file''** | determină formatul unui fișier |
| **''tree''** | listează conținutul directoarelor într-un format arborescent |
| **''mkdir''** | creează un director |
| **''ln''** | creare de link-uri |
| **''ls''** | listează conținutul unui director |
| **''ls -l''** | listează informații despre intrări, printre care și tipul intrărilor|
| **''rmdir''** | șterge un director gol |
| **''tar''** | creează o arhivă de tip {{{tar}}} |
| **''dd''** | realizează copierea la nivel de byte |
| **''gzip''** | creează o arhivă comprimată {{{gzip}}} |
| **''bzip2''** | creează o arhivă comprimată {{{bzip2}}} |
| **''find''** | caută fișiere ce corespund criteriilor specificate |
| **''mv''** | mută/redenumește un fișiere/director |
| **''rm''** | șterge un fișiere/director |
| **''touch''** | schimbă timpul de creare/acces/modificare a unui fișier/director |
| **''cpio''** | crează o arhivă de tip {{{cpio}}} |
| **''gunzip''** | dezarhivează un fișier de tip {{{gzip}}} |
| **''xz''** | arhivează și dezarhivează fișiere de tip {{{xz}}} sau {{{lzma}}} |
| **''lzma''** | echivalent cu **xz %%--%%format=lzma** |
==== Operații de bază cu fișiere ====
==== Listare/Creare/Ștergere fișiere ====
===== Listare =====
Filosofia UNIX ne spune că totul este un fișier, acest lucru însemnând de fapt că orice ''intrare'' pe hard-disk ne este expusă printr-o înșiruire de octeți oferită de sistemul de fișiere (putem interacționa cu ea).
Comanda **ce afișează** conținutul directorului curent este {{{ls}}}.
Dacă se dorește afișarea conținutului directorului curent + alte informații (tipul fișierelor, dimensiunea, drepturi, owner etc.) se poate utiliza argumentul {{{-l}}} al comenzii {{{ls}}}.
george@whatever:~/LPIC/files$ ls -l
total 1048580
-rw-rw-r-- 1 george george 0 mar 3 01:51 new_file
-rw-rw-r-- 1 george george 1073741824 mar 3 01:55 test_zero
Se poate observa însă că spațiul este afișat ca număr de bytes. Pentru afișarea dimensiunii într-o altă formă, mai ușor de citit, se pot utiliza argumentele {{{-lh}}}.
george@whatever:~/LPIC/files$ ls -lh
total 1,1G
-rw-rw-r-- 1 george george 0 mar 3 01:51 new_file
-rw-rw-r-- 1 george george 1,0G mar 3 01:55 test_zero
----
Dacă se dorește verificarea informațiilor (într-un mod mai amănunțit despre fișiere) se poate utiliza comanda {{{stat}}}.
Acesta oferă utilizatorului diferite informații. Unele dintre acestea sunt:
* numele fișierului
* dimensiunea
* drepturile de acces
* inode-ul - reprezintă o structură de date unde sunt păstrate metadatele (date despre date) despre fișiere
* diferiți timpi
Pentru căutarea fișierelor pe disc se poate utiliza comanda {{{find}}}.
În exemplul următor se caută toate fișierele care încep cu ''f''.
find locație -name nume_fișier
george@whatever:~/LPIC/find$ tree
.
├── file10
└── folder
├── director
│ ├── file0000
│ ├── nimic
│ └── stuff
├── file3
├── file4
└── file5
2 directories, 7 file
george@whatever:~/LPIC/find$ find . -name "f*"
./file10
./folder
./folder/file3
./folder/file5
./folder/file4
./folder/director/file0000
Utilitarul {{{tree}}} este folosit precum {{{ls}}}, pentru listarea conținutului unui director, însă având o afișare mai frumușică.
===== Creare =====
Pentru **a crea fișiere obișnuite** (regular files) se poate folosi comanda {{{touch}}} urmată de numele fișierului (fișierul nu va conține nimic):
Dacă veți verifica pagina de manual a comenzii {{{touch}}} ({{{man touch}}}) se poate observa că ea modifică timestampul fișierului, setându-l la momentul în care a fost dată comanda comandă. Acest lucru se întâmplă în cazul în care fișierul există, iar în caz contrar se va crea un nou fișier (nu conține date).
Pentru **a crea directoare** se utilizează comanda {{{mkdir}}} urmată de numele directorului.
Sa presupunem că dorim să creăm directoarele ''ana'', ''are'', ''mere'', ''stricate''.
Cum am face chestia asta?
* **Varianta 1**
*
george@whatever:~/LPIC/create$ mkdir ana
george@whatever:~/LPIC/create$ cd ana #(aici se poate utiliza combinația de taste ALT + . pentru a nu mai scrie din nou cuvantul ''ana'')
george@whatever:~/LPIC/create$ mkdir are
george@whatever:~/LPIC/create$ cd are
...and so on
* **Varianta 2**
*Comanda {{{mkdir}}} are un argument foarte interesant și anume {{{-p}}} care permite crearea unei ierarhii de directoare.
*
george@whatever:~/LPIC/create$ mkdir -p ana/are/mere/dar/e/nebuna
*Vă lăsăm pe voi să decideți care variantă este mai ușoară și mai practică având in vedere timpul necesar creării fișierelor
----
Pentru **a crea link-uri** se utilizează comanda {{{ln}}}:
* simplă pentru crearea unui link hard
* cu argumentul {{{-s}}} pentru crearea unui link simbolic
===== Mutare =====
Pentru **mutarea fișierelor** (atât fișiere simple cât și directoare/link-uri) se utilizează comanda {{{mv}}}.
De asemenea pentru **redenumirea fișierelor** se utilizează tot comanda {{{mv}}}.
mv name_file nume_nou_fișier (mv nume_fișier directoare/nume_nou_fișier - dacă doriți să îl mutați în alt director)
george@whatever:~/LPIC/mutare$ ls
file1
george@whatever:~/LPIC/move$ mv file1 file2
george@whatever:~/LPIC/move$ ls
file2
Atenție! Comanda {{{mv}}} poate suprascrie fișierelele existente dacă se mută/redenumește un fișier într-o locație unde există deja un fișier cu același nume. Dacă doriți o avertizare, în caz ca există deja un fiser cu acea denumire puteți utiliza argumentul {{{-i}}} (se va afișa un mesaj de confirmare a suprascrierii).
----
===== Copiere =====
Pentru **copiere fișierelor obișnuite și a link-urilor** se utilizează comanda {{{cp}}} urmată de fișierul ce urmează să se copieze și locația unde acesta va fi copiat (dacă se dorește se poate și redenumi).
george@whatever:~/LPIC/copy$ ls
file
george@whatever:~/LPIC/copy$ cp file ../file_new
george@whatever:~/LPIC/copy$ ls
file
george@whatever:~/LPIC$ ls
file_new
Dacă dorim să mutăm un director trebuie să adăugam argumentul {{{-r}}} (recursive).
george@whatever:~/LPIC/create$ ls -lh
total 4,0K
drwxrwxr-x 2 george george 4,0K mar 3 15:45 test_directory
george@whatever:~/LPIC/create$ cp test_directory/ ..
cp: omitting directory ‘test_directory/’
george@whatever:~/LPIC/create$ cp -r test_directory/ ..
george@whatever:~/LPIC/create$ ls ..
create test_directory
----
===== Ștergere =====
Pentru **ștergerea fișierelor simple și a link-urilor** se utilizeaza comanda {{{rm}}} urmată de numele fișierului.
george@whatever:~/LPIC/delete$ ls
file
george@whatever:~/LPIC/delete$ rm file
george@whatever:~/LPIC/delete$ ls
Se poate utiliza și comanda {{{unlink}}} atât pe fișiere simple, cât și pe link-uri.
Pentru **ștergerea directoarelor** se utilizează comanda {{{rmdir}}} urmată de numele folderului.
george@whatever:~/LPIC/delete$ ls
folder
george@whatever:~/LPIC/delete$ rmdir folder
george@whatever:~/LPIC/delete$ ls
Comanda {{{rmdir}}} nu va funcționa dacă directorul are fișiere în el (chiar și ascunse). Pentru aceasta se poate utiliza tot comanda {{{rm}}} la care se adaugă argumentul {{{-r}}}.
==== File Globbing =====
O parte importantă a lucrului cu fișiere o reprezintă **file globbing-ul**.
^ Expresie ^ Descriere ^
| **''*''** | se expandează la orice și oricâte caractere |
| **''?''** | se expandează la orice caracter |
| **''[]''** | se expandează la orice caracter din interiorul parantezelor |
| **''{}''** | se expandează la un șir de caractere din interiorul acoladelor |
Spre exemplu, pentru a lista toate fișierele **care încep cu numele lp** și se termină cu orice/oricâte caractere:
george@whatever:~/LPIC/globbing$ ls
file1 file2 file3 file4 file5 lpic101-1 lpic101-10 lpic101-2 lpic101-3 lpic101-4 lpic101-5 lpic101-6 lpic101-7 lpic101-8 lpic101-9
george@whatever:~/LPIC/globbing$ ls lp*
lpic101-1 lpic101-10 lpic101-2 lpic101-3 lpic101-4 lpic101-5 lpic101-6 lpic101-7 lpic101-8 lpic101-9
Pentru a afișa toate fișierele care **se termină cu o cifra de la 4 la 9**:
george@whatever:~/LPIC/globbing$ ls *[4-9]
file4 file5 lpic101-4 lpic101-5 lpic101-6 lpic101-7 lpic101-8 lpic101-9
Iar pentru a afișa toate fișierele care **nu se termină cu o cifra de la 4 la 9**:
george@whatever:~/LPIC/globbing$ ls *[!4-9]
file4 file5 lpic101-4 lpic101-5 lpic101-6 lpic101-7 lpic101-8 lpic101-9
Atenție! **Globbing** != **Regex** (expresii regulate), deși acestea seamănă prin setul de simboluri utilizat. Globbing-ul este folosit pentru nume de fișiere, în timp ce expresiile regulate sunt folosite pentru a găsi pattern-uri în fișierele text. În **Regex** caracterul {{{*}}} înseamnă că ''numărul de apariții al caracterului precedent poate fi oricât'' (chiar și 0), iar în **Globbing** semnifică ''orice caracter de oricâte ori'' (globbing {{{*}}} = {{{.*}}} regex; {{{.}}} - semnifică în regex orice caracter). More info in {{{man 7 glob}}} and și {{{man 7 regex}}} (Ce semnificație avea cifra 7? De ce nu merge să dăm simplu {{{man glob}}}?)
O chestie mișto de care dispune shell-ul se numește **brace expansion** utilizată pentru generarea de șiruri.
Să presupunem că trebuie să creăm 10 fișiere cu denumirile file0, file2, ..., file9. Cum putem face asta? (lăsând la o parte dând comanda {{{touch}}} cu 10 nume de fișiere). Ceea ce se poate observa destul de ușor este că fișierele au același prefix ca nume, deci trebuie să creeam fișiere ca încep cu ''file'' și se termină cu o cifră.
Putem utiliza atât comanda {{{seq}}} care afișează o serie de numere:
george@whatever:~/LPIC/brace_expansion$ ls
george@whatever:~/LPIC/brace_expansion$ touch $(seq -f "file%.0f" 0 9)
george@whatever:~/LPIC/brace_expansion$ ls
file0 file1 file2 file3 file4 file5 file6 file7 file8 file9
Fie putem utiliza **brace expansion**:
george@whatever:~/LPIC/brace_expansion$ ls
george@whatever:~/LPIC/brace_expansion$ touch file{0..9}
george@whatever:~/LPIC/brace_expansion$ ls
file0 file1 file2 file3 file4 file5 file6 file7 file8 file9
Utilizând acest mecanism putem exprima și toate combinările posibile între diferite șiruri, spre exemplu toate combinațiile între litere de la ''a'' la ''h'' și cifrele de la ''3'' la ''7'':
george@whatever:~/LPIC/brace_expansion$ echo {a..h}{3..7}
a3 a4 a5 a6 a7 b3 b4 b5 b6 b7 c3 c4 c5 c6 c7 d3 d4 d5 d6 d7 e3 e4 e5 e6 e7 f3 f4 f5 f6 f7 g3 g4 g5 g6 g7 h3 h4 h5 h6 h7
===== Convertire și copiere de fișiere =====
Pentru acest lucru vom folosi utilitarul {{{dd}}}.
{{{dd}}} poate fi utilizat specificând ca intrare/ieșire atât fișiere simple cât și:
* **dispozitive block**
*scrierea/citirea se face pe blocuri
*sunt în general fișiere ce abstractizează componentele hardware.
*Eg: ''/dev/sda'', ''/dev/hda'' fișierele ce oferă o zonă de acces spre hard-disk
* **dispozitive virtuale (pseudo-dispozitive)**
*scrierea/citirea se face per caracter
*sunt oferite de sistemul de operare
*''/dev/null'' - utilizat la aruncarea outputul nedorit
*''/dev/zero'' - utilizat la suprascierea cu valoarea ''0'' a zonelor de memorie sau pentru a încărca un fișier doar cu valori de ''0''
*''/dev/urandom'' - la fel ca ''/dev/zero'' utilizat pentru suprascrierea discului sau pentru a crea fișiere cu date aleatoare (valori pseudorandom)
*''/dev/full'' - utilizat pentru a simula un hard-disk care nu mai deține spațiu pentru alte fișiere
* Câteva exemple de utilizare:
* **/dev/null** && **/dev/zero**
george@whatever:~/LPIC/dd$ cat test_null
/dev/null este mișto dacă vrei sa arunci erorile
george@whatever:~/LPIC/dd$ cat test_null > /dev/null
george@whatever:~/LPIC/dd$
george@whatever:~/LPIC/dd$ dd if=/dev/zero of=test_zero bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1,1 GB) copied, 18,133 s, 59,2 MB/s
george@whatever:~/LPIC/dd$ ls -lh test_zero
-rw-rw-r-- 1 george george 1,0G mar 3 01:09 test_zero
* Verificați în {{{man}}} ce semnifică {{{bs}}} și {{{count}}}.
* ''/dev/random'' și ''/dev/urandom'' pot fi ușor confundate. ''/dev/urandom'' este utilizat pentru a produce valori aleatoare într-un mod continuu (dacă nu este suficient randomness creat, se va folosi un număr pseudorandom ca seed pentru a crea restul de date), pe când ''/dev/random'' furnizează un ''random mai bun'' deoarece acesta se blochează până când este ''colectat suficient randomness'' pentru a continua generarea numerelor.Puteți încerca acest lucru utilizând comenzile: {{{cat /dev/urandom (să aveți pregătit CTRL+C}}} și {{{cat /dev/random (observați că se blochează, însă dacă așteptați puțin se va observa în terminal cum se vor genera noi valori}}}.
Pentru convertirea fișierelor se utilizeaza argumentul {{conv}} urmat de un simbol predefinit (see {{{man dd}}}).
Exemplu de utilizare, se convertesc caracterele lowercase în uppercase:
george@whatever:~/LPIC/dd$ cat test_conv
ala bala PortocALA
george@whatever:~/LPIC/dd$ dd if=test_conv of=test_conv_upp conv=ucase
0+1 records in
0+1 records out
19 bytes (19 B) copied, 0,000416704 s, 45,6 kB/s
george@whatever:~/LPIC/dd$ cat test_conv_upp
ALA BALA PORTOCALA
===== Exerciții =====
# Creați trei fișiere, denumite ''unu'', ''doi'' și ''trei'' în directorul propriu (//home//) și validați că acestea există si au dimensiunea corectă folosind comanda {{{ls}}}.
#* Fișierul ''unu'' nu va conține nimic.
#* Fișierul ''doi'' va conține 1MB de date (zero-uri).
#* Fișierul ''trei'' va conține 100MB de date (random).
# Așteptați un minut după crearea fișierelor de mai sus. Folosiți comanda {{{touch}}} pe fișierul {{{unu}}}. Folosiți, din nou, comanda {{{ls -l}}}. Ce observați?
# Creați în directorul propriu două directoare denumite ''dir1'' și ''dir2''.
# Mutați fișierul ''unu'' în directorul ''dir1''. Mutați fișierele ''doi'' și ''trei'' în directorul ''dir2'' dintr-o singură comandă. Mutați directorul ''dir1'' în directorul ''dir2''.
# Afișati conținutul celor 2 directoare recursiv (folosind {{{ls}}}) și utilizând comanda {{{tree}}}.
# Creați un nou fișier cu numele ''patru'' și încercați să îl mutați în directorul ''dir1'' redenumindu-l ''unu''. Mutarea trebuie să se facă doar dacă utilizatorul confirmă suprascrierea fișierului ''unu'' (Hint: man mv, overwrite).
# Schimbați directorul curent în ''dir2'' și copiați conținutul acestuia un nivel mai sus, în directorul propriu. Copierea directoarelor trebuie făcută recursiv, cu parametrul adecvat. Folosiți wildcard-ul {{{*}}} (star).
# Ștergeți directorul {{{dir1}}} folosind comanda {{{rm}}}. Apoi ștergeți directorul {{{dir2}}} folosind {{{rmdir}}}.
# Creați un folder cu numele {{{mod}}} și modificați-l astfel încât să aiba drepturile 777
#* Utilizați chmod
#* Utilizați doar comanda mkdir (Hint: {{{man mkdir}}})
#* După ce ați terminat validați drepturile.
# Creați 10 fișiere cu denumirile: file0, file2...file9.
#* {{{touch}}} de 10 ori - nah, too much work
#* Utilizând **brace expansion** - folosit pentru generarea de șiruri - (Eg: echo {1..10})
#* Afișați doar fișierele care încep cu ''file''.
# Creați 3 fișiere care încep cu "Ana are " și se termină cu {{{{mere, pere, alune}}}}.
# Afișați toate combinările posibile între literele: {{{c, d, e, f}}} și cifrele: {{{1, 2, 3, 4}}}.
# Afișați toate literele alfabetului englez.
# Creați în directorul {{{/home/student}}} următoarea structură de directoare {{{/home/student/the/unix/file/system/sure/it/corrupts/your/data/but/look/how/fast/it/is}}}. (Hint: opțiunea {{{parent}}} a comenzii {{{mkdir}}})
# Intrați în directorul {{{/home/student/the/unix/file/system/sure/it/corrupts/your/data/but/look/how/fast/it/is}}} și creați trei fișiere, denumite {{{ext2}}}, {{{ext3}}} și {{{ext4}}}.
# Modificați data când fișierul {{{ext4}}} a fost accesat și modificat la 2010.05.23 15:25 (Hint: {{{touch}}})
# Verificați faptul că modificările au fost aplicate. Care este inode-ul fișierului {{{ext4}}} ? (Hint: {{{stat}}})
#* Utilizați comanda {{{stat}}} pentru a afișa doar numele și inode-ul fișierului.
# Creați link-ul simbolic {{{sym-ext4}}} către fișierul {{{ext4}}}. (Hint: {{{man ln}}}, căutați "symbolic")
#* De ce nu e bine să utilizezi căi relative la crearea unui link simbolic?
# Scrieți textul "current file system" în {{{ext4}}} și afișați conținutul lui {{{sym-ext4}}}.
## Ștergeți fișireul {{{ext4}}} și afișați conținutul lui {{{sym-ext4}}}.
## Aflați tipul fișierului {{{sym-ext4}}} (Hint: {{{file}}})
# Creați link-ul hard {{{hard-ext3}}} către fișierul {{{ext3}}}.
## Aflați inode-urile pentru {{{hard-ext3}}} și {{{ext3}}}. (Hint: {{{stat}}})
## Scrieți textul "old file system" în {{{ext3}}} și afișați conținutul lui {{{hard-ext3}}}.
## Aflati tipul fișierului {{{hard-ext3}}} (Hint: {{{file}}})
## Ștergeți fișierul {{{ext3}}} și afișați conținutul lui {{{hard-ext3}}} - de ce merge?
# Creați un fișier de 10 MB denumit {{{random_file}}} (cu date random).
## Copiați primii 3 MB din fișierul {{{random_file}}} în fișierul {{{random_1}}}.
## Copiați ultimii 7 MB din fișierul {{{random_file}}} în fișierul {{{random_2}}}. {{{Hint: skip}}}
## Recreați fișierul de 10 MB folosind doar fișierul {{{random_1}}} și {{{random_2}}} (Hint: {{{seek}}} or {{{append}}}, check the man)
## Validați rezolvarea cu ajutorul comenzii {{{diff}}}.
# Utilizați comanda {{{find}}} pentru a găsi toate fișierele din {{{/etc}}} care se termină în ''.allow'' sau ''.deny'' {{{Hint: {{{man find}}}, look after operators}}}.
# Comanda {{{find}}} poate executa anumite comenzi pe fișierele găsite utilizând următoarea sintaxa:
find location -name pattern -exec cp {} . \;
{} - se va expanda la denumirea fișierului găsit (cu tot cu calea dată spre căutare)
#* Utilizând comanda {{{find}}} copiați toate fișierele găsite în {{{/etc}}} (nu trebuie verificate alte directoare din {{{/etc}}}) cu extensia {{{.conf}}} în directorul curent cu denumirea {{{nume_initial-copie}}} (Hint: maxdepth).
==== Arhivare și compresie de fișiere ====
===== Arhivare =====
Arhivarea reprezintă comprimarea mai multor fișiere într-unul singur pentru o mai ușoara distribuție.
Pentru crearea arhivelor se utilizează utilitarul {{{tar}}} sau {{{cpio}}} (copy in, copy out).
Mai există un utilitar, ''archiver'' (comanda ar) care poate fi folosit pentru arhivarea fișierelor, însă în prezent este utilizat în mare parte pentru crearea bibliotecilor statice.
george@whatever:~/LPIC/archive$ tar -cf archive.tar file*
george@whatever:~/LPIC/archive$ ls arhiva.tar
arhiva.tar
george@whatever:~/LPIC/archive$ tar -xf archive.tar
george@whatever:~/LPIC/archive$ ls file*
file0 file1 file2
george@whatever:~/LPIC/archive$ ls file* | cpio -ov > archive.cpio
george@whatever:~/LPIC/archive$ ls archive.cpio
arhiva.tar
george@whatever:~/LPIC/archive$ cpio -idv < archive.cpio
george@whatever:~/LPIC/archive$ ls file*
file0 file1 file2
george@whatever:~/LPIC/archive$ ar cr libtest.a test1.o test2.o
george@whatever:~/LPIC/archive$ ls libtest.a
libtest
george@whatever:~/LPIC/archive$ ar x libtest.a
george@whatever:~/LPIC/archive$ ls test*
test1.o test2.o
Verificați ce semnifică parametrii la fiecare comandă.
Se pot adăuga fișiere noi la arhivele deja create sau fișiere ce deja există în arhivă, dar au fost updatate.
Pentru adăugarea unui nou fișier într-o arhivă tar se poate utiliza argumentul {{{-r}}} ({{{--append}}}) (fișierul este concatenate la sfârșitul fișierelor deja existente). De asemenea dacă se dorește adăugarea unui fișier doar în cazul în care cel deja existent în arhiva este outdated se poate folosi parametrul {{{-u}}} ({{{--update}}}).
Dacă {{{tar}}} nu primește parametrul {{{-f}}} atunci conținutul arhivei se va afișa la stdout.
george@whatever:~/LPIC/archive$ tar -c file[0-9]
file10000664000175000017500000000000012666166712011310 0ustar georgegeorgefile20000664000175000017500000000000012666166712011311 0ustar georgegeorgefile30000664000175000017500000000000012666166712011312 0ustar georgegeorgefile40000664000175000017500000000000012666166712011313 0ustar georgegeorgefile50000664000175000017500000000000012666166712011314 0ustar georgegeorgefile60000664000175000017500000000000012666166712011315 0ustar georgegeorgefile70000664000175000017500000000000012666166712011316 0ustar georgegeorgefile80000664000175000017500000000000012666166712011317 0ustar georgegeorgefile90000664000175000017500000000000012666166712011320 0ustar georgegeorgegeorge@whatever:~/LPIC/archive$
==== Comprimarea ====
Comprimarea înseamnă reducerea memoriei utilizate pentru a reține date pe disc, cât și posibilitatea recuperării datelor originale.
Utilitarul {{{tar}}} poate fi folosit și pentru compresie având câteva argumente ce ne vin în ajutor.
* {{{-z}}} - comprimare folosind ''gzip''
* {{{-j}}} - comprimare folosind ''bzip2''
* {{{--xz}} sau {{{--lzma}}} - comprimare în format ''xz'' sau ''lzma''
* {{{--lzop}}} - comprimare în format ''lzop''
* {{{-lzip}}} - comprimare în format ''lzip''
Pentru a comprima o arhivă simplă tar se pot utiliza și utilitarele {{{xz}}} și {{{lzma}}} având ca argument numele arhivei:
george@whatever:~/LPIC/archive$ xz archive.tar # rezultă archive.tar.xz
george@whatever:~/LPIC/archive$ lzma archive.tar # rezultă archive.tar.lzma
Iar pentru decomprimare se utilizează {{{unxz}}} și {{{unlzma}}}:
george@whatever:~/LPIC/archive$ unxz archive.tar.xz # rezultă archive.tar
george@whatever:~/LPIC/archive$ unlzma archive.tar.lzma # rezultă archive.tar
La fel cum sunt utilitarele {{{xz}}} și {{{lzma}}} există și {{{gzip}}} și {{{bzip2}}}, însă acestea primesc direct fișierul ce se dorește comprimat:
george@whatever:~/LPIC/archive$ gzip -c file1 > file1.gz
george@whatever:~/LPIC/archive$ file file1.gz
file1.gz: gzip compressed data, was "file1", last modified: Fri Mar 4 04:07:06 2016, from Unix
george@whatever:~/LPIC/archive$ bzip2 -c file1 > file1.bz2
george@whatever:~/LPIC/archive$ file file1.bz2
file1.bz2: bzip2 compressed data, block size = 900k
Parametrul {{{-c}}} poate fi omis și oferite mai multe fișiere spre a fi comprimate, iar la final vom avea fișierele comprimate cu denumirea inițiala la care se adaugă prefixul specific comprimării efectuate (se șterg fișierele inițiale).
george@whatever:~/LPIC/archive$ gzip file1 file2 file3
george@whatever:~/LPIC/archive$ ls
file1.gz file2.gz file3.gz
george@whatever:~/LPIC/archive$ bzip2 file1 file2 file3
george@whatever:~/LPIC/archive$ ls
file1.bz2 file2.bz2 file3.bz2
===== Exerciții =====
# Arhivați directorul {{{/home/student/the/unix}}} (creat într-un exercițiu anterior) cu toate fișierele și subdirectoarele conținute de acesta într-o arhivă {{{unix.tar}}}. Atenție: doar arhivați directorul, nu îl și comprimați.
# Arhivați din nou directorul {{{/home/student/the/unix}}} cu toate fișierele și subdirectoarele conținute de acesta într-o arhivă {{{unix.tar.gz}}}. De data aceasta comprimați arhiva. Observați diferența de mărime față de arhiva anterioară.
# Afișați conținutul arhivei {{{unix.tar}}} fără a o dezarhiva. (Hint: {{{man tar}}}, căutați "list". Nu uitați să specificați numele arhivei prin {{{-f}}})
# Realizați o arhivă {{{cpio}}} cu același conținut. (Hint: folosiți {{{find}}} pentru a-i specifica utilitarului fișierele de arhivat).
# Folosiți {{{apt-cache show atool}}} pentru a afișa informații despre pachetul {{{atool}}}. Instalați pachetul și realizați, respectiv, arhive {{{.tar.gz}}}, {{{.tar.bz2}}}, {{{.zip}}}, {{{.cpio}}}, {{{.Z}}}.
# Creați fisierul {{{/home/student/big-text-file.txt}}} care să conțină cel puțin 5 MB text (date aleator generate).
# Arhivați fisierul {{{big-text-file.txt}}} în format {{{gzip}}}, {{{bzip2}}} și {{{zip}}}. Care sunt diferențele de mărime ale arhivelor?
# Creați, respectiv, arhivele {{{conf.zip}}}, {{{conf.tar.gz}}}, {{{conf.cpio}}} care conțin fișierele cu extensia {{{.conf}}} din ierarhia {{{/etc/}}}.
# Creați o ierarhie de fișiere și directoare în {{{/home/student/usr}}} care să conțină toate directoarele și toate fișierele din /usr care au inclus în numele lor șirul 'stdio' folosind comanda {{{cpio}}}. Ierarhia trebuie păstrată. (Hint: {{{cpio pass through}}})
# Comprimați directorul {{{/home/student/the/unix}}} cu toate fișierele și subdirectoarele conținute de acesta în două arhive {{{unix.tar.xz}}} și {{{unix.tar.lzma}}} folosind direct utilitarul tar. Comparați dimensiunea arhivelor rezultate cu dimensiunea arhivei de la exercițiul 1.
# Creați un nou fișier {{{file1}}} de 5MB conținând date random (utilizați ''/dev/urandom'') și un folder numit {{{tar-power}}}. Arhivați acest fișier (fără comprimare) astfel încât arhiva să se găsească în folderul {{{tar-power}}} (Hint: {{{man tar}}}, ''change directory'').
# Creați un nou fișier {{{file2}}} de 7MB conținând zero-uri și adăugați-l în arhivă (nu creați arhiva de la 0).
# Creați o a doua arhiva care să conțină ambele fișiere {{{file1}}} și {{{file2}}}.
# Suprascrieți fișierul {{{file1}}} astfel încât acesta să conțină alte date (dimensiunea sa fie tot 5MB). Se poate verifica dacă fișierul dintr-o arhivă este diferit de cel nearhivat utilizand parametrul {{{-d}}}.
# Adăugați fișierul {{{file1}}} în ambele arhive însă utilizând diferite moduri:
#* Utilizând ''append''
#* Utilizând ''update''
#* Rulați comanda {{{diff}}} pe cele 2 arhive. Ce observati?
#* Arhivele sunt identice din cauză ca {{{update}}} nu suprascrie fișierul în arhiva, ci doar îl adaugă la sfârșit - se poate verifica ușor listând conținutul arhivei.
#* Concatenați cele 2 arhive păstrând conținutul într-una dintre arhive (Hint: {{{man tar}}}, concatenate).
#** ''Atentie!'' Cele 2 arhive ar trebui să aibă același format deoarece concatenarea nu va verifica compatibilitatea între ele.
#* Dacă se dorește păstrarea fișierelor din arhiva, în cazul în care se dorește să se facă update la arhivă (să se adauge diferite fișiere), se poate utiliza parametrul {{{-k}}}.
# Creați un folder {{{extract}}} unde veți dezarhiva doar fișierul {{{file2}}} din arhiva.
# Extrageți din arhivă fișierul {{{file1}}} inițial.
#* Nu se va putea realiza adăugând doar numele deoarece se vor dezarhiva ambele versiuni ale fișierului, iar cea mai veche va fi suprascrisă.
#* Utilizați {{{--occurrence=nr}}} pentru a specifica care apariție să fie dezarhivată.
# Creați un link simbolic spre cele 2 fișiere {{{file1}}} și {{{file2}}} și arhivați cele 2 link-uri într-o nouă arhivă, astfel încât în arhivă rezultată să se găsescă fișierele (Hint: {{dereference}}})