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.
În acest capitol discutăm despre cum interacționăm cu fișierele în linia de comandă.
/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
Î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 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
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.
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
.
/home/student/uso_lab02
folosind comanda:
student@uso:~$ cd /home/student/uso_lab02/ student@uso:~/uso_lab02$ pwd /home/student/uso_lab02
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:~/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.
Ș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
.
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
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 (...)
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ă).
mv
de mutare / redenumire de fișiere și directoare.
Vikings
în directorul de la calea /home/student/uso_lab02
.Ragnar
, Rollo
, Lagertha
în directorul Vikings
./tmp/
.
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.
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:
.profile
);rm Avengers/*
). Acestea nu au efect asupra fișierelor ascunse;
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
.
.LordOfTheRings
în directorul de la calea /home/student/uso_lab02
.Aragorn
, Legolas
, Frodo Baggins
.~
)./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
/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:~/uso_lab02$ tree . └─── Cale └─── Lungă └─── De └─── Directoare
/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.
/home/student/uso_lab02
către directorul Netflix
.Netflix
.
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).