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 sectiuni.
Folosim linia de comandă pentru interacțiunea cu fișierele în mai multe cazuri:
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ă.
Un exemplu de ierarhie de fișier este în secțiunea Căi în ierarhia de fișiere.
Pentru a vedea fișierele sub formă arborescentă, folosim comanda tree
.
student@uso:~r$ tree -L 1 / / |-- bin |-- boot |-- dev |-- etc |-- home |-- initrd.img -> /boot/initrd.img-3.16.0-4-586 |-- lib |-- lib64 |-- libx32 |-- lost+found |-- media |-- mnt |-- opt |-- proc |-- root |-- run |-- sbin |-- srv |-- sys |-- tmp |-- usr |-- var ``-- vmlinuz -> boot/vmlinuz-3.16.0-4-586
În această secțiune vom învăța să lucrăm cu fișierele și directoarele în linia de comandă:
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 Music Public Templates Documents examples.Desktop Pictures snap Videos
Vedem mai multe detalii despre fișierele și directoarele din directorul /home/student
(adică directorul home al utilizatorului student, ~) folosind comanda ls
:
student@uso:~$ ls -l total 48 drwxr-xr-x 3 student student 4096 Oct 13 12:53 Desktop drwxr-xr-x 2 student student 4096 Sep 30 05:03 Documents drwxr-xr-x 2 student student 4096 Sep 30 05:03 Downloads drwxr-xr-x 2 student student 4096 Sep 30 05:03 Music drwxr-xr-x 2 student student 4096 Sep 30 05:03 Pictures drwxr-xr-x 2 student student 4096 Sep 30 05:03 Public drwxr-xr-x 2 student student 4096 Sep 30 05:03 Templates drwxr-xr-x 2 student student 4096 Sep 30 05:03 Videos -rw-r--r-- 1 student student 8980 Sep 24 09:00 examples.desktop drwxr-xr-x 4 student student 4096 Oct 2 03:11 snap
Interpretarea rezultatelor de mai sus o vom discuta într-un laborator viitor.
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:~$ ls cities ls: cannot access cities: No such file or directory student@uso:~$ touch cities student@uso:~$ 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:~$ touch cities romania student@uso:~$ ls -l (...) -rw-rw-r-- 1 student student 0 Oct 13 13:02 cities -rw-r--r-- 1 student student 8980 Sep 24 09:00 examples.desktop -rw-rw-r-- 1 student student 0 Oct 13 13:02 romania drwxr-xr-x 4 student student 4096 Oct 2 03:11 snap
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:~$ touch "cities in romania" student@uso:~$ ls -l (...) -rw-rw-r-- 1 student student 0 Oct 13 13:02 cities -rw-rw-r-- 1 student student 0 Oct 13 13:03 'cities in romania' -rw-r--r-- 1 student student 8980 Sep 24 09:00 examples.desktop -rw-rw-r-- 1 student student 0 Oct 13 13:02 romania drwxr-xr-x 4 student student 4096 Oct 2 03:11 snap
Acum avem în directorul ~
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.
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:~$ mkdir GameOfThrones student@uso:~$ mkdir Avengers student@uso:~$ ls -l total 56 drwxrwxr-x 2 student student 4096 Oct 13 13:17 Avengers (...) drwxrwxr-x 2 student student 4096 Oct 13 13:17 GameOfThrones (...)
Am creat 2 directoare noi: Avengers
și GameOfThrones
.
touch
) sau director (mkdir
), executăm comanda de verificare ls
.
Afișăm rapid conținutul fișierului Arya
din directorul GameOfThrones
folosind comanda cat
:
student@uso:~$ cat GameOfThrones/Arya student@uso:~$
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:~$ echo "A girl has no name" > "GameOfThrones/Arya" student@uso:~$ cat "GameOfThrones/Arya" A girl has no name
Ștergem fișierul “Hulk” din directorul “Avengers” folosind utilitarul rm
:
student@uso:~$ ls Avengers/ Captain America Hulk Iron Man student@uso:~$ rm Avengers/Hulk student@uso:~$ ls Avengers/ Captain America Iron Man
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
.
Directoarele se șterg folosind comanda rmdir
. Etimologia comenzii provine din engleză - remove directory.
Creăm directorul “LordOfTheRings” folosind comanda mkdir
după care îl ștergem folosind comanda rmdir
:
student@uso:~$ mkdir LordOfTheRings student@uso:~$ 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 drwxr-xr-x 2 student student 4096 Sep 29 18:09 LordOfTheRings (...) student@uso:~$ rmdir LordOfTheRings student@uso:~$ ls -l total 56 drwxr-xr-x 2 student student 4096 Sep 29 18:02 Avengers (...) drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones (...)
Am creat un director LordOfTheRings
folosind utilitarul mkdir
. Am verificat crearea acestuia. În final l-am șters folosind utilitarul rmdir
și am verificat că a fost șters.
rmdir
pe un director care nu este gol (care conține cel puțin un alt fișier sau director) nu funcționează.
student@uso:~$ rmdir Avengers/ rmdir: failed to remove 'Avengers/': Directory not empty
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:~$ ls -l total 56 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:~$ rm -r Avengers/ student@uso:~$ ls -l total 52 (...) drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones (...)
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:~$ ls GameOfThrones student@uso:~$ mv GameOfThrones ThroneOfGames student@uso:~$ 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:~$ ls Avengers GameOfThrones student@uso:~$ mv GameOfThrones/ /tmp/ student@uso:~$ ls /tmp/ GameOfThrones ssh-ApUMKI3HSJ student@uso:~$ ls /tmp/ GameOfThrones ssh-ApUMKI3HSJ student@uso:~$ 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:~$ mv ../../../../tmp/GameOfThrones/ /home/student/ student@uso:~$ ls Avengers GameOfThrones
Am verificat că directorul GameOfThrones
se află la calea indicată (calea curentă).
mv
de mutare / redenumire de fișiere și directoare.
Vikings
în directorul home al vostru.Ragnar
, Rollo
în directorul Vikings
./tmp/
.GameOfThrones
în ThronesInTheGame
.ThronesInTheGame
în /tmp
.
Copiem fișierul Captain America
în directorul /tmp/
folosind cp
:
student@uso:~$ cp 'Avengers/Captain America' /tmp/ student@uso:~$ ls /tmp/ Thor ssh-ApUMKI3HSJ
Sintaxa este similară comenzii mv
. Acum fișierul Captain America
este atât în /home/student/Avengers/Captain America
, cât și în /tmp/Captain America
.
student@uso:~$ 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:~$ cp -r Avengers/ /tmp/ student@uso:~$ 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 Captain America drwx------ 2 student student 4096 Sep 29 13:45 ssh-ApUMKI3HSJ student@uso:~$ 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.
~
)./home/student/
(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
/tmp
. Folosiți comanda cp
. (Hint: recursivitate).Favorite.txt
din directorul Hulu
. Confirmați ștergerea prin afișarea directorului părinte.prime video
.HBO GO
.Netflix
.mkdir
pentru a crea toată ierarhia dintr-o singură executare a comenzii:student@uso:~$ tree . └─── Cale └─── Lungă └─── De └─── Directoare
/tmp
în directorul Directoare
.student@uso:~$ pwd /home/student
Cale relativă:
student@uso:~$ ls -l snap/spotify/ total 8 drwxr-xr-x 5 student student 4096 Oct 2 03:11 42 drwxr-xr-x 3 student student 4096 Oct 2 03:10 common lrwxrwxrwx 1 student student 2 Oct 2 03:10 current -> 42
Cale absolută:
student@uso:~$ ls -l /home/student/snap/spotify total 8 drwxr-xr-x 5 student student 4096 Oct 2 03:11 42 drwxr-xr-x 3 student student 4096 Oct 2 03:10 common lrwxrwxrwx 1 student student 2 Oct 2 03:10 current -> 42
student@uso:/etc$ pwd /etc student@uso:/etc$ cd /usr student@uso:/usr$ pwd /usr
Caracterul -
:
student@uso:~$ pwd /home/student student@uso:~$ cd /usr/bin/ student@uso:/usr/bin$ pwd /usr/bin student@uso:/usr/bin$ cd - /home/student student@uso:~$ cd - /usr/bin student@uso:/usr/bin$ cd - /home/student student@uso:~$ cd - /usr/bin
Caracterul ~
:
student@uso:/usr/bin$ cd /tmp/ student@uso:/tmp$ pwd /tmp student@uso:/tmp$ cd ~ student@uso:~$ pwd /home/student student@uso:~$ cd /usr/bin/X11/ student@uso:/usr/bin/X11$ pwd /usr/bin/X11 student@uso:/usr/bin/X11$ cd ~ student@uso:~$ pwd /home/student
student@uso:~$ tree -L 1 / / |-- bin |-- boot |-- dev |-- etc |-- home |-- initrd.img -> /boot/initrd.img-3.16.0-4-586 |-- lib |-- lib64 |-- libx32 |-- lost+found |-- media |-- mnt |-- opt |-- proc |-- root |-- run |-- sbin |-- srv |-- sys |-- tmp |-- usr |-- var ``-- vmlinuz -> boot/vmlinuz-3.16.0-4-586
student@uso:~/Avengers$ ls Captain America Iron Man Thor
student@uso:~$ ls -l (...) -rw-rw-r-- 1 student student 0 Oct 13 13:02 cities -rw-rw-r-- 1 student student 0 Oct 13 13:03 'cities in romania' -rw-r--r-- 1 student student 8980 Sep 24 09:00 examples.desktop -rw-rw-r-- 1 student student 0 Oct 13 13:02 romania drwxr-xr-x 4 student student 4096 Oct 2 03:11 snap
student@uso:~$ ls cities ls: cannot access cities: No such file or directory student@uso:~$ touch cities student@uso:~$ ls cities cities
student@uso:~$ mkdir GameOfThrones student@uso:~$ mkdir Avengers student@uso:~$ ls -l (...) drwxr-xr-x 2 student student 4096 Sep 29 17:43 Avengers (...) drwxr-xr-x 2 student student 4096 Sep 29 17:43 GameOfThrones (...)
student@uso:~$ cat GameOfThrones/Arya A girl has no name
student@uso:~$ ls Avengers/ Captain America Hulk Iron Man Thor student@uso:~$ rm Avengers/Hulk student@uso:~$ ls Avengers/ Captain America Iron Man Thor
student@uso:~$ mkdir LordOfTheRings student@uso:~$ ls -l total 12 drwxr-xr-x 2 student student 4096 Sep 29 18:02 Avengers drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones drwxr-xr-x 2 student student 4096 Sep 29 18:09 LordOfTheRings student@uso:~$ rmdir "LordOfTheRings" student@uso:~$ ls -l total 8 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:~$ ls GameOfThrones student@uso:~$ mv GameOfThrones ThroneOfGames student@uso:~$ ls ThroneOfGames
student@uso:~$ cp Avengers/Thor /tmp/ student@uso:~$ ls /tmp/ Thor ssh-ApUMKI3HSJ