Table of Contents

Interacțiunea cu fișiere în linia de comandă

Fișierul este unitatea de bază folosită pentru a stoca informații. Fie că este vorba despre un document (tema la mate) sau un joc, fie că este vorba de o configurare în sistemul de operare, sau chiar sistemul de operare, folosim fișiere pentru stocare.

Putem interacționa cu fișiere folosind programe specifice:

Acestea au în comun o interfață grafică. O altă opțiune este să interacționăm cu fișierele în linia de comandă. Acesta este subiectul acestei secțiuni.

Folosim linia de comandă pentru interacțiunea cu fișierele în mai multe cazuri:

Un motiv în plus pentru a folosi linia de comandă este că folosește mult mai puține resurse decât interfața grafică. Astfel, putem să facem mai multe cu mai puține resurse.

Componenta ce se ocupă de interpretarea comenzilor se numește shell. Shellul citește comenzile date de utilizator, le interpretează și comunică sistemului de operare ce are de făcut.

În acest capitol discutăm despre cum interacționăm cu fișierele în linia de comandă.

Pentru exercițiile din acest capitol, asigurați-vă că sunteți în directorul /home/student/uso_lab02. Pentru a face acest lucru, rulati urmatoarele comenzi:

student@uso:~$ mkdir /home/student/uso_lab02/
student@uso:~$ cd /home/student/uso_lab02/
student@uso:~/uso_lab02$ pwd
/home/student/uso_lab02

Lucrul cu fișiere și directoare

În această secțiune vom învăța să lucrăm cu fișierele și directoarele în linia de comandă:

Afișarea conținutului unui director

Așa cum un dosar are mai multe foi în el, la fel și directoarele au mai multe fișiere și directoare în ele.

Pentru a afișa conținutul unui director folosim comanda ls:

student@uso:~$ ls
Desktop    Downloads  Pictures  Templates  examples.desktop  vm-actions-log.txt
Documents  Music      Public    Videos     uso.git

Vedem mai multe detalii despre fișierele și directoarele din directorul /home/student (adică directorul home al utilizatorului student, ~) folosind comanda ls -l:

student@uso:~$ student@uso:~$ ls -l
total 56
drwxr-xr-x  2 student student 4096 aug  6  2018 Desktop
drwxr-xr-x  3 student student 4096 aug 20  2018 Documents
drwxr-xr-x  2 student student 4096 aug  6  2018 Downloads
drwxr-xr-x  2 student student 4096 aug  6  2018 Music
drwxr-xr-x  2 student student 4096 aug  6  2018 Pictures
drwxr-xr-x  2 student student 4096 aug  6  2018 Public
drwxr-xr-x  2 student student 4096 aug  6  2018 Templates
drwxr-xr-x  2 student student 4096 aug  6  2018 Videos
-rw-r--r--  1 student student 8980 aug  6  2018 examples.desktop
drwxr-xr-x 14 student student 4096 aug 20  2018 uso.git
-rw-r--r--  1 student student 4827 aug 21  2018 vm-actions-log.txt

Interpretăm rezultatele de mai sus:

  1. Primul caracter - ne arată că examples.desktop este un fișier obișnuit. Primul caracter d ne arată că Desktop este director.
  2. Șirurile rw-r--r-- (pentru examples.desktop) și rwxr-xr-x (pentru Desktop) se referă la permisiuni de acces. Vorbim despre permisiuni de acces în capitolul Îmbunătățirea lucrului în linia de comandă.
  3. Următorul număr îl îgnorăm pentru moment.
  4. Următoarele două cuvinte, student, se referă tot la permisiuni și ownership; le vom discuta într-un capitol ulteror.
  5. Numărul 8980 arată dimensiunea fișierului examples.desktop. Observăm că directorul Desktop are dimensiunea de 4096 octeți (bytes);
  6. Urmează 3 coloane ce arată momentul ultimei modificări. O accesare poate înseamna creare sau modificare. Citirea nu schimbă această dată.
  7. La final este afișat numele fișierului sau a directorului.

Exerciții - afișarea conținutului directoarelor

Crearea fișierelor

Există situații când vrem să creăm fișiere. De exemplu vrem să scriem cod sau să luăm notițe la un curs.

Fișierele se creează folosind utilitarul touch.

Creăm un fișier astfel:

student@uso:~$ cd /home/student/uso_lab02/
student@uso:~/uso_lab02$ pwd
/home/student/uso_lab02
student@uso:~/uso_lab02$ ls cities
ls: cannot access 'cities': No such file or directory
student@uso:~/uso_lab02$ touch cities
student@uso:~/uso_lab02$ ls cities 
cities

Dacă vrem să creăm un fișier cu numele orașe romania, adică vrem ca numele fișierului să conțină caracterul spațiu (space), folosim tot comanda touch ca în exemplul de mai jos:

student@uso:~/uso_lab02$ touch cities romania
student@uso:~/uso_lab02$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct 12 01:05 cities
-rw-rw-r-- 1 student student 0 oct 12 01:05 romania

Observăm că în comanda de mai sus am încercat să creăm un fișier numit cities romania, însă au fost create două fișiere. Pentru a crea un fișier cu spații (space) inclus în nume este nevoie să folosim ghilimelele la începutul și sfârșitul numelui astfel: touch "cities romania".

student@uso:~/uso_lab02$ touch "cities in romania"
student@uso:~/uso_lab02$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct 12 01:05  cities
-rw-rw-r-- 1 student student 0 oct 12 01:05 'cities in romania'
-rw-rw-r-- 1 student student 0 oct 12 01:05  romania

Acum avem în directorul ~/uso_lab02 3 fișiere în plus: cities, cities in romania, romania. Zero-ul (0) din linia -rw-r--r-- 1 student student 0 Oct 13 13:02 cities ne arată că fișierul cities are 0 bytes, adică este gol. Toate cele 3 fișiere sunt goale.

Crearea directoarelor

Este util să creăm directoarele atunci când vrem să păstrăm fișierele din sistem într-un mod organizat. De exemplu, putem crea câte un director pentru fiecare an de licență. Pentru fiecare an/director, cream câte un director pentru fiecare materie si pentru fiecare materie putem să facem directoare pentru teme, laboratoare, cursuri etc.

Creăm directoarele folosind utilitarul mkdir. Etimologia comenzii provine din limba engleză - make directory.

Creăm un directoarele GameOfThrones și Avengers în directorul ~ ca în exemplul de mai jos:

student@uso:~$ cd ~/uso_lab02/
student@uso:~/uso_lab02$ mkdir GameOfThrones
student@uso:~/uso_lab02$ mkdir Avengers
student@uso:~/uso_lab02$ ls -l
total 8
drwxrwxr-x 2 student student 4096 oct 12 01:07  Avengers
drwxrwxr-x 2 student student 4096 oct 12 01:07  GameOfThrones
(...)

Am creat 2 directoare noi: Avengers și GameOfThrones.

Exerciții - creare fișiere și directoare

Pentru următoarele exerciții, asigurați-vă că sunteți în directorul /home/student/uso_lab02 folosind comanda:

student@uso:~$ cd /home/student/uso_lab02/
student@uso:~/uso_lab02$ pwd
/home/student/uso_lab02

Este important de reținut: orice comandă executați, aceasta trebuie succedată de o verificare. De exemplu, la crearea unui fișier (touch) sau director (mkdir), executăm comanda de verificare ls.

Afișarea conținutului unui fișier

Afișăm rapid conținutul fișierului Arya din directorul GameOfThrones folosind comanda cat:

student@uso:~/uso_lab02$ cat GameOfThrones/Arya
student@uso:~/uso_lab02$

Comanda cat nu a afișat nimic pentru că fișierul Arya este gol.

Scriem textul A girl has no name în fișierul Arya folosind comanda echo:

student@uso:~/uso_lab02$ echo "A girl has no name" > "GameOfThrones/Arya"
student@uso:~/uso_lab02$ cat "GameOfThrones/Arya"
A girl has no name

O altă metodă este de a folosi un editor de text: vim, gedit, emacs, nano, sublime, etc. Vom detalia utilizarea unui editor de text în subsectiunea Editor de text.

Ștergerea fișierelor

Ștergem fișierul “Hulk” din directorul “Avengers” folosind utilitarul rm:

student@uso:~/uso_lab02$ ls Avengers/
Captain America  Hulk  Iron Man  Thor
student@uso:~/uso_lab02$ rm Avengers/Hulk
student@uso:~/uso_lab02$ ls Avengers/
Captain America  Iron Man  Thor

La prima comandă am afișat ce fișiere sunt în directorul Avengers. Am folosit utiltarul rm pentru a șterge fișierul Hulk din directorul Avengers. În final am verificat că fișierul Hulk nu mai există în directorul Avengers.

Ștergerea directoarelor

Directoarele se șterg folosind comanda rmdir sau comanda rm -r. Etimologia comenzii provine din engleză - remove directory. Incercam sa stergem directorul Avengers folosind ambele comenzi:

student@uso:~/uso_lab02$ ls -l
total 60
drwxr-xr-x 2 student student 4096 Sep 29 18:02 Avengers
(...)
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)
student@uso:~/uso_lab02$ rmdir Avengers/
rmdir: failed to remove 'Avengers/': Directory not empty

Comanda rmdir pe un director care nu este gol (care conține cel puțin un alt fișier sau director) nu funcționează.

Pentru a șterge un director care nu este gol, adică un director care are cel puțin un fișier sau director în el, folosim utilitarul rm cu opțiunea de recursivitate -r: rm -r. Aceasta permite ștergerea întregii ierarhii de fișiere din director, pe scurt: ștergerea întregului director.

student@uso:~/uso_lab02$ rm -r Avengers/
student@uso:~/uso_lab02$ ls -l
total 52
(...)
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)

După executarea comenzii, verificăm corectitudinea operației. Trebuie să verificăm și să nu presupunem că o comandă s-a executat. Lipsa unei verifică poate duce la erori și mult timp pierdut din partea noastră.

Redenumirea și mutarea fișierelor și directoarelor

Fișierele și directoarele se redenumesc în mod similar, folosind comanda mv astfel: mv nume_actual nume_nou.

Redenumim fișierele si directoarele folosind comanda mv:

student@uso:~/uso_lab02$ ls
GameOfThrones
student@uso:~/uso_lab02$ mv GameOfThrones ThroneOfGames
student@uso:~/uso_lab02$ ls
ThroneOfGames

Am redenumit fișierul GameOfThrones în ThroneOfGames.

Un alt rol al comenzii mv este de a muta fișierele și directoarele, în ierarhia de fișiere, dintr-un loc în altul.

Mutăm directorul GameOfThrones (cu tot conținutul acestuia) la calea /tmp/ folosind comanda mv:

student@uso:~/uso_lab02$ ls
Avengers  GameOfThrones
student@uso:~/uso_lab02$ mv GameOfThrones/ /tmp/
student@uso:~/uso_lab02$ ls /tmp/
GameOfThrones  ssh-ApUMKI3HSJ
student@uso:~/uso_lab02$ ls /tmp/
GameOfThrones  ssh-ApUMKI3HSJ
student@uso:~/uso_lab02$ ls
Avengers

Acum directorul GameOfThrones se află în calea /tmp/GameOfThrones. Am verificat folosind ls că nu se mai află în directorul curent și că există în directorul /tmp/.

Mutăm înapoi directorul GameOfThrones (cu tot conținutul acestuia) folosind cale relativă, pentru a indica directorul, și cale absolută, pentru a indica locul unde vrem să ajungă directorul folosind mv:

student@uso:~/uso_lab02$ mv ../../../tmp/GameOfThrones/ /home/student/
student@uso:~/uso_lab02$ ls
Avengers  GameOfThrones

Am verificat că directorul GameOfThrones se află la calea indicată (calea curentă).

Observăm că putem folosi atât căi relative, cât și căi absolute ca argumente pentru comanda mv de mutare / redenumire de fișiere și directoare.

Exerciții - redenumire și mutare

    • Creați un director Vikings în directorul de la calea /home/student/uso_lab02.
    • Creați fișierele Ragnar, Rollo, Lagertha în directorul Vikings.
    • Verificați că directorul și fișierele au fost create.
    • Mutati directorul (împreună cu întreaga ierarhie de fișiere) la locația /tmp/.
    • Verificați că directorul și ierarhia de fișiere au fost mutate.
    • Creați un director NBA în directorul de la calea /home/student/uso_lab02.
    • Creați fișierele MichaelJordan, LeBronJames, DwayneWade și KobeBryant în directorul NBA.
    • Verificați că directorul și fișierele au fost create.
    • Mutați directorul NBA (împreună cu întreaga ierarhie de fișiere) în directorul Vikings.
    • Verificați că directorul și ierarhia de fișiere au fost mutate.
    • Redenumiți directorul GameOfThrones în ThronesInTheGame.
    • Mutați fișierele din interiorul directorului ThronesInTheGame în /tmp.
    • Verificați operațiile.
    • Mutați directorul înapoi la locatia inițială folosind atât căi relative cât și căi absolute.

Copierea fișierelor și directoarelor

Copiem fișierul Thor în directorul /tmp/ folosind cp:

student@uso:~/uso_lab02$ cp Avengers/Thor /tmp/
student@uso:~/uso_lab02$ ls /tmp/
Thor  ssh-ApUMKI3HSJ

Sintaxa este similară comenzii mv. Acum fișierul Thor este atât în /home/student/Avengers/Thor, cât și în /tmp/Thor.

student@uso:~/uso_lab02$ cp Avengers/ /tmp/
cp: omitting directory 'Avengers/'

Observăm că nu se poate copia un director ce conține alte fișiere sau directoare.

Pentru a copia în altă parte un director care nu este gol, trebuie să folosim comanda cp -r:

student@uso:~/uso_lab02$ cp -r Avengers/ /tmp/
student@uso:~/uso_lab02$ ls -l /tmp/
total 8
drwxr-xr-x 2 student student 4096 Sep 29 19:06 Avengers
-rw-r--r-- 1 student student    0 Sep 29 19:04 Thor
drwx------ 2 student student 4096 Sep 29 13:45 ssh-ApUMKI3HSJ
student@uso:~/uso_lab02$ ls -l /tmp/Avengers/
total 0
-rw-r--r-- 1 student student 0 Sep 29 19:06 Captain America
-rw-r--r-- 1 student student 0 Sep 29 19:06 Iron Man
-rw-r--r-- 1 student student 0 Sep 29 19:06 Thor

Am copiat directorul Avengers și conținutul acestuia din calea curentă în directorul /tmp. Observăm că s-a copiat întreaga ierarhie de fișiere/directoare de sub directorul Avengers. Acesta se află acum în ambele locuri.

Fișiere și directoare ascunse

Un fișier sau director este ascuns atunci când nu apare în mod normal în ierarhia de fișiere. De exemplu, atunci când executăm într-un director comanda ls, acesta nu apare.

Există câteva motive pentru care vrem să ascundem un fișier sau director:

Vedem fișiere și directoare ascunse folosind comanda ls -a:

student@uso:~/uso_lab02$ ls -al
total 56
drwxr-xr-x 5 student student 4096 Sep 29 18:41 .
drwxr-xr-x 4 student student 4096 Sep 29 18:35 ..
drwxr-xr-x 2 student student 4096 Sep 29 18:20 Avengers
(...)
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)

Opțiunea -a vine de la all, adică vrem să vedem toate fișierele: și cele vizibile și cele ascunse.

Observăm două directoare noi . și ... Directorul . este o referință la directorul curent, iar .. este o referință la directorul părinte.

Directorul .. este în cazul nostru echivalent cu /home/student.

Creăm fișiere ascunse punând un punct (.) în fața numelui:

student@uso:~/uso_lab02/Avengers$ ls -l
total 0
-rw-r--r-- 1 student student 0 Sep 29 18:20 Captain America
-rw-r--r-- 1 student student 0 Sep 29 18:20 Iron Man
-rw-r--r-- 1 student student 0 Sep 29 18:20 Thor
student@uso:~/uso_lab02/Avengers$ touch .Hulk
student@uso:~/uso_lab02/Avengers$ ls -l
total 0
-rw-r--r-- 1 student student 0 Sep 29 18:20 Captain America
-rw-r--r-- 1 student student 0 Sep 29 18:20 Iron Man
-rw-r--r-- 1 student student 0 Sep 29 18:20 Thor
student@uso:~/uso_lab02/Avengers$ ls -al
total 8
drwxr-xr-x 2 student student 4096 Oct  6 16:44 .
drwxr-xr-x 5 student student 4096 Sep 29 19:14 ..
-rw-r--r-- 1 student student    0 Oct  6 16:44 .Hulk
-rw-r--r-- 1 student student    0 Sep 29 18:20 Captain America
-rw-r--r-- 1 student student    0 Sep 29 18:20 Iron Man
-rw-r--r-- 1 student student    0 Sep 29 18:20 Thor

Am creat fișierul ascuns .Hulk. Observăm că acesta nu apare la execuția ls -l, dar apare la execuția comenzii ls -al.

Similar, creăm directoare ascunse punând un (.) în fața numelui:

student@uso:~/uso_lab02$ mkdir .LordOfTheRings
student@uso:~/uso_lab02$ ls
Avengers  GameOfThrones
student@uso:~$ ls -al
total 20
drwxr-xr-x 5 student student 4096 Sep 29 18:41 .
drwxr-xr-x 4 student student 4096 Sep 29 18:35 ..
drwxr-xr-x 2 student student 4096 Sep 29 18:41 .LordOfTheRings
drwxr-xr-x 2 student student 4096 Sep 29 18:20 Avengers
(...)
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)

Am creat directorul ascuns .LordOfTheRings.

Exerciții - creare fișiere/directoare ascunse

    • Creați un director cu numele .LordOfTheRings în directorul de la calea /home/student/uso_lab02.
    • Intrați în directorul creat.
    • Creați 3 fișiere ascunse cu numele Aragorn, Legolas, Frodo Baggins.
    • Verificați operațiile de creare (director și fișiere).
    • Creați un director cu numele stiri în directorul de la calea /home/student/uso_lab02.
    • Creați fișierele hotnews, biziday, digi24.
    • Creați fișierul ascuns .cancan.
    • Afișați toate fișierele din director.
    • Afișați fișierele din director care nu sunt ascunse.
    • Creați un director tv în directorul de la calea /home/student/uso_lab02.
    • Creați fișierele ProTV, Digi24, Eurosport.
    • Creați fișierele ascunse Antena3, Romania24.
    • Afișați toate fișierele din director.
    • Afișați fișierele din director care nu sunt ascunse.
    • Copiați directorul stiri împreună cu fișierele de sub acesta în directorul tv.
    • Mutați fișierele .Antena3 și .Romania24 în directorul /tmp.

Exerciții suplimentare - ierarhii de fișiere și directoare

  1. Afișați ierarhia de fișiere pornind de la directorul vostru home (~).
  2. Creați următoarea ierarhie pornind de la directorul /home/student/uso_lab02 (Notă: Numele cu extensie din structura sunt fișiere, restul sunt directoare):
student@uso:~$ tree
.
├── prime_video
├── Hulu
│   └── Favorite.txt
├── Netflix
│   ├── Filme
│   │   ├── filme_2020.txt
│   │   ├── filme_2019.txt
│   │   ├── filme_vechi
│   └── Seriale
│       ├── seriale_2020
│       ├── seriale_2019.txt
│       └── seriale_vechi
├── HBO_GO
│   ├── Modern_Family.txt
│   └── Harry_Potter
└── YouTubeTV
  1. Copiați întreaga ierarhie în calea /tmp. Folosiți comanda cp. (Hint: recursivitate).
  2. Confirmați copierea prin afișarea directorului părinte.
  3. Ștergeți fișierul Favorite.txt din directorul Hulu. Confirmați ștergerea prin afișarea directorului părinte.
  4. Ștergeți directorul prime video.
  5. Confirmați ștergerea prin afișarea directorului părinte.
  6. Ștergeți directorul HBO GO.
  7. Găsiți parametrii corespunzători ștergerii unui director care nu este gol.
  8. Confirmați ștergerea prin afișarea directorului părinte.
  9. Ștergeți ierarhia de directoare începând cu directorul Netflix.
  10. Confirmați ștergerea prin afișarea directorului părinte.
  11. Creați ierarhia de directoare de mai jos.
  12. Căutați parametrul necesar pentru mkdir pentru a crea toată ierarhia dintr-o singură executare a comenzii:
    student@uso:~/uso_lab02$ tree
    .
    └─── Cale
        └─── Lungă
             └─── De
                  └─── Directoare
  13. Mutați ierarhia copiată anterior în /tmp în directorul Directoare.

O legătură este o scurtătură către un fișier sau un director. Acestea sunt necesare atunci când nu vrem să parcurgem toată ierarhia de fișiere. De exemplu, punem executabilul jocului Warcraft3 pe Desktop pentru a-l accesa rapid. Mai multe legături pot referi același director/fișier.

Caracteristici:

Creăm o legătură simbolică către directorul /home/student/uso_lab02/Avengers/Thor folosind comanda ln -s:

student@uso:~/uso_lab02$ ln -s /home/student/uso_lab02/Avengers/Thor thor
student@uso:~/uso_lab02$ ls -l
(...)
lrwxrwxrwx 1 student student 28 Oct  6 17:58 thor -> /home/student/uso_lab02/Avengers/Thor
(...)

Observăm că fișierul creat este link (are primul caracter l). Mai mult, observăm că acest link este o scurtătură către calea /home/student/uso_lab02/Avengers/Thor.

Scriem textul “Hello” în fișierul Avengers/Thor:

student@uso:~/uso_lab02$ echo "Hello" > Avengers/Thor
student@uso:~/uso_lab02$ cat Avengers/Thor
Hello
student@uso:~/uso_lab02$ cat thor
Hello

Vedem conținutul fișierului atât folosind o cale (relativă sau absolută), cât și folosind legătura simbolică (shortcutul).

Vedem în continuare ce se întâmplă dacă ștergem un fișier.

student@uso:~$ cd /tmp
student@uso:/tmp$ touch /home/student/uso_lab02/test
student@uso:/tmp$ ls -l /home/student/uso_lab02
(...)
drwxr-xr-x 2 student student 4096 Sep 29 18:20 Avengers
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)
-rw-r--r-- 1 student student    0 Sep 29 19:04 test
(...)
student@uso:/tmp$ ln -s /home/student/uso_lab02/test my_link
student@uso:/tmp$ ls -l
(...)
lrwxrwxrwx 1 student student    28 oct 12 01:33 my_link -> /home/student/uso_lab02/test
(...)
student@uso:/tmp$ rm my_link
student@uso:/tmp$ ls
student@uso:/tmp$ ls -l /home/student/uso_lab02
(...)
drwxr-xr-x 2 student student 4096 Sep 29 18:20 Avengers
drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones
(...)

Observăm că dacă am șters un fișier accesându-l prin legătura, s-a șters și la destinație.

Exerciții - legături (linkuri)

Execuția programelor

Execuția unui fișier/program se face folosind calea către fișier în locul unei comenzi pe care am rula-o în mod normal. Putem rula un executabil folosind o care relativă cum ar fi ./executabil sau ./director/executabil, ori folosind o cale absoluta cum ar fi /usr/bin/firefox.

Creăm un executabil (adică un program) numit my_ls care face același lucru ca și comanda ls:

student@uso:~$ cd /home/student/uso_lab02
student@uso:~/uso_lab02$ cp /bin/ls my_ls

Executăm executabilul creat de noi ca mai jos:

student@uso:~/uso_lab02$ ./my_ls
(...) my_ls (...) 

Putem folosi atât calea relativă cât și absolută:

student@uso:~/uso_lab02$ ls -l
(...)
-rwxr-xr-x 1 student student 133792 Oct 13 14:01  my_ls
-rw-rw-r-- 1 student student      0 Oct 13 13:05  romania
(...)
student@uso:~/uso_lab02$ ./my_ls
GameOfThrones  cities	 my_ls  'cities in romania'   romania
(...)
student@uso:~$ /home/student/my_ls
GameOfThrones  cities	 my_ls  'cities in romania'   romania
(...)

Observăm cum se rulează un executabil atât cu cale relativă (în primul caz) cât și cu cale absolută (în al doilea caz).