This is an old revision of the document!
Până acum am dat comenzi în terminal și am urmărit outputul (rezultatul) lor. Outputul (rezultatul) este afișat în terminal. Dacă voiam să salvăm outputul undeva (de obicei într-un fișier) trebuia să copiem outputul, să creăm un fișier nou sau să folosim unul deja existent, să îl deschidem, să lipim textul în el și să salvăm modificările. Trecerea prin toți acești pași durează și devenim ineficienți în lucrul în terminal.
Interpretorul de comenzi (shellul) are opțiunea de a direcționa afișarea rezultatului direct într-un fișier.
Rezultatul unei comenzi este format din două fluxuri de informații: informații de ieșire (standard output, stdout) și de eroare (standard error, stderr). Avem opțiunea de a direcționa (redirecta) doar ieșirea, doar eroarea sau ambele fluxuri într-un fișier.
Mergem în directorul ~/redirection
rulând comanda cd ~/redirection
. Acolo avem mai multe fișiere, câte unul pentru fiecare materie. Afișăm fișierele folosind comanda ls
:
student@uso:~$ cd ~/redirection student@uso:~$ ls -lh total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO
Salvăm outputul comenzii ls -lh
de mai sus folosind caracterul >
, astfel:
student@uso:~$ ls -lh > lista_materii student@uso:~$ ls EGC lista_materii RL USO
Observăm că acțiunea de mai sus a făcut două lucruri: a creat fișierul lista_materii
și a introdus în conținutul fișierului rezultatul comenzii ls -lh
.
Caracterul >
așteaptă un șir de caractere după el care este numele fișierului în care vrem să scriem outputul. Șirul este, de fapt, calea către un fișier. Șirul lista_materii
este calea relativă până la fișierul lista_materii
care se află în directorul curent /home/student
.
Fișierul lista_materii
nu exista. Prin direcționarea outputului am creat fișierul lista_materii
.
Vizualizăm conținutul fișierului lista_materii
folosind comanda cat
:
student@uso:~$ cat lista_materii total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 224K Aug 19 12:00 lista_materii -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO
Ștergem fișierul lista_materii
folosind comanda rm lista_materii
Îl vom crea din nou în următoarele momente.
Folosirea caracterului >
suprascrie conținutul fișierului:
student@uso:~$ rm lista_materii student@uso:~$ cd comenzi/mkdir student@uso:~/comenzi/mkdir$ cat lista_materii cat: lista_materii: No such file or directory student@uso:~$ ls -l /usr/ > lista_materii student@uso:~$ cat lista_materii total 72 drwxr-xr-x 2 root root 61440 Sep 9 14:07 bin drwxr-xr-x 2 root root 4096 Aug 31 2015 games drwxr-xr-x 34 root root 16384 Sep 9 14:06 include drwxr-xr-x 74 root root 4096 Sep 9 14:07 lib drwxr-xr-x 3 root root 4096 Nov 21 2015 lib32 drwxr-xr-x 2 root root 4096 Nov 21 2015 libexec drwxr-xr-x 3 root root 12288 Nov 21 2015 libx32 drwxrwsr-x 10 root root 4096 Nov 21 2015 local drwxr-xr-x 2 root root 12288 Sep 9 14:07 sbin drwxr-xr-x 137 root root 12288 Sep 9 14:07 share drwxr-xr-x 2 root root 4096 Aug 31 2015 src student@uso:~$ echo "cats" > lista_materii student@uso:~$ cat lista_materii cats
Fișierul lista_materii
nu era creat inițial. În urma comenzii ls -l /usr/ > lista_materii
, fișierul lista_materii
a fost creat și populat cu ieșirea comenzii ls -l /usr/
. Comanda echo "cats" > lista_materii
suprascrie conținutul inițial al fișierului, înlocuindu-l cu rezultatul comenzii echo "cats"
.
tree
pentru a afișa ierarhia de fișiere pornind de la /home/student
;tree
pentru afișarea aceleiași ierarhii, dar de data asta direcționați-o în fișierul ierarhie_student
;
Putem direcționa rezultatul comenzii, fără a suprascrie fișierul. Facem acest lucru folosim caracterele >>
folosind fișierul creat anterior lista_materii
:
student@uso:~$ ls >> lista_materii student@uso:~$ ls EGC lista_materii RL USO student@uso:~$ cat lista_materii total 6.1M -rw-r--r-- 1 student student 1.1M Aug 19 11:55 EGC -rw-r--r-- 1 student student 209K Aug 19 12:00 lista_materii -rw-r--r-- 1 student student 2.1M Aug 19 11:55 RL -rw-r--r-- 1 student student 3.1M Aug 19 11:55 USO EGC lista_materii RL USO
Acum avem în fișierul lista_materii
, pe lângă conținutul vechi, și outputul comenzii ls
.
tree
pentru a afișa ierarhia de fișiere pornind de la /tmp
;tree
pentru a afișa aceeași ierarhie, dar de data asta direcționați-o prin anexare la fișierul ierarhie_student
creat anterior;ierarhie_student
folosind comanda cat
.tree
pentru a afișa ierarhia de fișiere pornind de la /usr
;ierarhie_student
folosit anterior;ierarhie_student
folosind comanda cat
. Mai exista conținutul inițial al fișierului?
Atunci când direcționăm ieșirea unei comenzi folosind >
sau >>
, ne referim doar la ieșirea standard, nu și la erori.
Folosim caracterele 2>
pentru a direcționa ieșirea de eroare către un fișier:
student@uso:~$ ls EGC lista_materii RL USO student@uso:~$ cat lista_materie cat: lista_materie: No such file or directory
Am vrut să afișăm conținutul fișierului lista_materie
, însă acest fișier nu există. Am primit informația No such file or directory, și aceasta este afișată sub formă de eroare.
Direcționăm conținutul fișierului SO2
în fișierul materii
:
student@uso:~$ cat SO2 > materii cat: SO2: No such file or directory
Vedem că dacă folosim direcționarea simplă >
, eroarea tot este afișată.
student@uso:~$ cat SO2 2> materii student@uso:~$ cat materii cat: SO2: No such file or directory
Observăm că nu am primit eroare la prima comandă unde am încercat să afișăm conținutul unui fișier inexistent. Informațiile de eroare au fost direcționate în fișier.
Redirectările de eroare și ieșire pot fi folosite simultan folosind caracterele specifice >
pentru ieșire și 2>
pentru eroare. Putem folosi sintaxa comanda > fișier_ieșire 2> fișier_erori
pentru a face acest lucru.
student@uso:~$ cat USO SO2 USO is the b3st! USO Rullz cat: SO2: No such file or directory
În exemplul de mai sus încercăm să afișăm conținutul fișierelor USO
și SO2
, dar cu fișierul SO2
neexistent. Liniile USO is the b3st!
și USO Rullz
sunt conținutul fișierelului USO
. Comanda cat
ne-a arătat conținutul celor 2 fișiere. Tot comanda cat
a încercat să afișeze conținutul fișierului SO2
, însă el nu există și a afișat eroarea No such file or directory
.
În continuare vom face o separare a fluxurilor: direcționăm ieșirea în fișierul continut_materii
și erorile în fișierul erori_comenzi
. Ca să redirectăm și outputul și erorile de la o comandă folosim și >
și 2>
ca mai jos:
student@uso:~$ cat USO SO2 > continut_materii 2> erori_comenzi student@uso:~$ cat continut_materii USO is the b3st! USO Rullz student@uso:~$ cat erori_comenzi cat: SO2: No such file or directory
Observăm cum după executarea primei comenzi, la ecran nu mai apare nimic; atât ieșirea standard cât și erorile au fost direcționate în fișiere. În continuare am verificat conținutul acestor fișiere pentru a demonstra corectitudinea operației.
/etc/passwd
într-un fișier cu numele utilizatori_si_grupuri
./etc/group
în același fișier./etc/shadow
în fișierul parole
și afișați conținutul fișierului. HINT: Puteți folosi sudo!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 pentru arhivare comprimată.
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.
Putem crea o arhivă folosind utilitarul zip
, astfel:
student@uso:~$ cd ~/archive student@uso:~$ ls -l total 42M -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:~$ 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:~$ ls -lh total 56M -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
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.
Mai sus afișarea dimensiunii este în format human-readable adică în MegaBytes (MegaOcteți). Afișăm dimensiunea în octeți:
student@uso:~$ ls -l -rw-rw-r-- 1 student student 14517242 oct 14 00:11 inregistrari.zip
Arhiva zip
are dimensiunea de 14517242 bytes.
Mergem mai departe cu un experiment. Dacă facem o arhivare și comprimare a ierarhiei de directoare /usr/bin
și comparăm dimensiunea:
student@uso:~$ ls -l -rw-r--r-- 1 student student 87282498 Sep 29 04:46 usr_bin.zip student@uso:~$ ls -lh -rw-r--r-- 1 student student 84M Sep 29 04:46 usr_bin.zip
Putem observa deja o diferență mai mare de dimensiune între cele două.
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
.Putem vizualiza conținutul arhivei astfel:
student@uso:~$ 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:~$ ls -l total 57168 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -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:~$ rm inregistrari.zip
În prima instanță, ștergem arhiva inregistrari.zip
. În continuare, recreăm arhiva inregistrari.zip
și ștergem fișierele inregistrare_lab01.mp4
, inregistrare_lab02.mp4
, inregistrare_lab03.mp4
:
student@uso:~$ 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:~$ ls -l total 34828 drwxr-xr-x 3 student student 4096 oct 11 12:15 dezarhivare -rw-r--r-- 1 student student 5242880 oct 11 02:23 inregistrare_lab01.mp4 -rw-r--r-- 1 student student 3145728 oct 11 02:23 inregistrare_lab02.mp4 -rw-r--r-- 1 student student 1048576 oct 11 02:23 inregistrare_lab03.mp4 -rw-r--r-- 1 student student 7340032 oct 11 12:35 inregistrare_lab04.mp4 -rw-r--r-- 1 student student 9439072 oct 11 18:02 inregistrari.zip student@uso:~$ rm inregistrare_lab01.mp4 inregistrare_lab02.mp4 inregistrare_lab03.mp4
În momentul de față avem doar arhiva zip și urmează să obținem fișierele cu înregistrari, folosind utilitarul zip
:
Pentru a dezarhiva o arhivă folosim utilitarul unzip
. Puteți observa 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 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:~$ tree . |-- dezarhivare | ``-- zip | |-- inregistrare_lab01.mp4 | |-- inregistrare_lab02.mp4 | ``-- inregistrare_lab03.mp4 |-- inregistrare_lab01.mp4 |-- inregistrare_lab02.mp4 |-- inregistrare_lab03.mp4 |-- inregistrare_lab04.mp4 ``-- inregistrari.zip 3 directories, 9 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:~$ rm inregistrare_lab03.mp4 student@uso:~$ ls -lh total 34M drwxr-xr-x 4 student student 4.0K oct 11 18:05 dezarhivare total 48M drwxr-xr-x 4 student student 4.0K oct 11 18:05 dezarhivare -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:~$ unzip inregistrari.zip inregistrare_lab03.mp4 Archive: inregistrari.zip inflating: inregistrare_lab03.mp4 student@uso:~$ ls -lh drwxr-xr-x 4 student student 4.0K oct 11 18:05 dezarhivare -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:~$ zip -u inregistrari.zip inregistrare_lab04.mp4 adding: inregistrare_lab04.mp4 (deflated 0%) student@uso:~$ 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
.
student@uso:~$ ls -lh total 9.0M -rw-r--r-- 1 student student 5.0M Aug 19 11:55 USO -rw-r--r-- 1 student student 3.0M Aug 19 11:55 RL -rw-r--r-- 1 student student 1.0M Aug 19 11:55 EGC student@uso:~$ ls -lh > lista_materii student@uso:~$ ls EGC lista_materii RL USO
student@uso:~$ ls >> lista_materii student@uso:~$ ls USO RL EGC lista_materii student@uso:~$ cat lista_materii total 9.2M -rw-r--r-- 1 student student 1.0M Aug 19 11:55 EGC -rw-r--r-- 1 student student 209K Aug 19 12:00 lista_materii -rw-r--r-- 1 student student 5.0M Aug 19 11:55 USO -rw-r--r-- 1 student student 3.0M Aug 19 11:55 RL EGC lista_materii RL USO
student@uso:~$ ls EGC lista_materii RL USO student@uso:~$ cat S02 cat: S02: No such file or directory student@uso:~$ cat S02 2> erori_materii student@uso:~$ cat erori_materii cat: S02: No such file or directory
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 înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov înregistrări.zip
student@uso:~$ zip -sf înregistrări.zip Archive contains: înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov
student@uso:~$ ls înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov înregistrări.zip student@uso:~$ rm înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov student@uso:~$ unzip înregistrări.zip Archive: înregistrări.zip inflating: înregistrare_lab01.mov inflating: înregistrare_lab02.mov inflating: înregistrare_lab03.mov student@uso:~$ ls înregistrare_lab01.mov înregistrare_lab02.mov înregistrare_lab03.mov înregistrări.zip
student@uso:~$ mkdir -p 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 | |-- zip | |-- înregistrare_lab01.mov | |-- înregistrare_lab02.mov | ``-- înregistrare_lab03.mov |-- înregistrare_lab04.mov ``-- înregistrări.zip 2 directories, 5 files
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)