Atunci când folosim un terminal este important să știm unde ne aflăm în ierarhie. Dacă vrem să jucăm un joc, știm că vrem să ajungem în directorul Games
, unde avem jocul preferat, Warcraft3
. Pentru a ajunge în directorul Games
, trebuie să știm unde suntem și apoi să navigăm în sistemul de fișiere până acolo.
O ierarhie de fișiere și directoare este o structură de organizare a acestora. Structura ierarhică permite gruparea acestora în directoare, ce conțin la rândul lor alte directoare sau fișiere. În acest fel, putem lucra doar cu un subset de fișiere și directoare din totalitatea acestora de pe sistem.
Un astfel de exemplu este următorul:
În Linux, începutul acestei ierarhii este /
, directorul rădăcină al sistemului de fișiere (root directory). Dacă privim sistemul de fișiere ca un arbore întors, directorul rădăcină este chiar rădăcina acestui arbore. De acolo cresc ramurile și frunzele sistemului de fișiere, formând ceea ce vom numi căi (paths).
Putem vedea mai jos începutul ierarhiei din Linux:
student@uso:~$ tree -F -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
Observăm /
(directorul rădăcină) la începutul ierarhiei. Pe nivelul următor, adică ramuri / copii ai directorului rădăcină, sunt directoarele bin
, boot
, dev
etc.
Observăm conținutul directorului home
:
student@uso:~$ tree -F -L 1 /home . ``-- student/
Există un singur director, numit student
.
student@uso:/$ tree -F -L 1 /
eram în directorul /
.student@uso:/home$ tree -F -L 1
eram în directorul /home
.
Avansăm în ierarhia de directoare către student
:
student@uso:~$ tree -F -L 2 . |-- Desktop/ |-- Documents/ |-- Downloads/ |-- Music/ |-- Pictures/ |-- Public/ |-- Templates/ |-- Videos/ |-- examples.desktop |-- uso-lab/ | |-- assignments/ | |-- labs/ | |-- lectures/ | |-- README.md `-- vm-actions-log.txt
Directorul acesta este directorul home al utilizatorului student. În rezultatul comenzii tree -F -L 2
, vedem primele două niveluri din ierarhia din directorului /home/student
.
În continuare detaliem conceptul de cale.
Pornim de la următoarea analogie: Avem patru puncte pe o dreaptă: A, B, C și D. Pentru a ajunge de la A la D, trebuie să trecem prin B și C. Astfel, avem următoarele segmente: AB, BC, CD.
Similar, pentru sistemul de fișiere, pornim de la directorul rădăcină (/
) și coborâm pe arbore.
Lista de directoare intermediare de la rădăcina ierarhiei de fișiere (/
) până la un anumit fișier sau director se numeste cale.
Calea curentă este pozitia noastră în sistemul de fișiere.
În lina de comandă afișăm calea până la directorul în care ne aflăm (calea curentă) folosind comanda pwd
(print working directory) :
student@uso:~$ pwd /home/student
Aceasta afișează poziția noastră în sistemul de fișiere.
Ne mutăm la calea /usr/bin
folosind comanda cd
(change directory):
student@uso:~$ pwd /home/student student@uso:~$ cd /usr/bin/ student@uso:/usr/bin$ pwd /usr/bin
Acum ne aflăm la poziția /usr/bin
în sistemul de fișiere. Observăm cum calea curentă se schimbă atunci când schimbăm directorul în care ne aflăm. Vom vorbi despre comanda cd
în laboratorul Îmbunătățirea lucrului în linia de comandă.
În exemplele de mai sus, observăm că există un delimitator între directoare: / (slash). Atunci când compunem calea, după fiecare nod/director (nivel de arbore) prin care trecem, punem acest delimitator. Astfel, îi transmitem sistemului de operare că am înaintat în ierarhia de fișiere.
Faptul că și directorul rădăcină (/
) are același simbol, este doar o coincidență. În Windows, nodul rădăcină este C:
, iar separatorul de cale este \
.
Atunci când vrem să citim, scriem, ștergem un fișier sau director trebuie să ne referim la acel fișier sau director. Practic, orice operație în sistemul de fișiere (arhivare, criptare, ștergere, editare) folosește căi. Este impropriu să spunem “deschide fișierul /home/student/a.txt
”; tehnic corect este “deschide fișierul de la calea /home/student/a.txt
”.
În sistemul de fișiere, ne putem referi la un fișier prin 2 modalități: folosind calea relativă sau folosind calea absolută.
Spre exemplu, luăm un serial pe Netflix. Ne referim la un episod în două moduri:
Similar, ne referim la un fișier:
/
, numită cale absolută.
După cum am precizat mai sus, calea absolută începe întotdeauna cu caracterul /
(slash), denumit și director rădăcină. Acesta indică începutul ierarhiei de fișiere.
Afișăm fișierele /usr/bin/touch
și /etc/passwd
prin cale absolută, folosind ls
:
student@uso:~$ ls -l /usr/bin/touch lrwxrwxrwx 1 root root 10 Mar 14 2015 /usr/bin/touch -> /bin/touch student@uso:~$ ls -l /etc/passwd -rw-r--r-- 1 root root 1768 Sep 9 14:07 /etc/passwd
Am folosit opțiunea -l a utilitarului ls
pentru a afișa informații suplimentare ale fișierelor.
Observăm că la începutul căilor este întotdeauna caracterul '/' (directorul rădăcină).
Prin calea relativă ne referim la un fișier în funcție de calea curentă.
student@uso:~$ ls -l uso-lab.git/labs/ total 52 drwxrwxr-x 4 student student 4096 nov 9 2021 00-intro drwxrwxr-x 4 student student 4096 nov 9 2021 01-filesystem drwxrwxr-x 4 student student 4096 nov 9 2021 02-process drwxrwxr-x 5 student student 4096 nov 9 2021 03-user drwxrwxr-x 4 student student 4096 nov 9 2021 04-appdev drwxrwxr-x 4 student student 4096 nov 9 2021 05-cli drwxrwxr-x 4 student student 4096 nov 9 2021 06-scripting drwxrwxr-x 4 student student 4096 nov 9 2021 07-hardware-obsolete drwxrwxr-x 5 student student 4096 nov 9 2021 07-networking drwxrwxr-x 4 student student 4096 nov 9 2021 08-security drwxrwxr-x 4 student student 4096 nov 9 2021 08-storage-obsolete drwxrwxr-x 3 student student 4096 nov 9 2021 09-task-admin drwxrwxr-x 4 student student 4096 nov 9 2021 11-ctf
În exemplul de mai sus, ne aflăm la calea /home/student
și am coborât în ierarhia de fișiere către directorul uso-lab.git
, apoi către directorul labs
.
Același rezultat îl obținem folosind calea absolută:
student@uso:~$ ls -l /home/student/uso-lab.git/labs/ total 52 drwxrwxr-x 4 student student 4096 nov 9 2021 00-intro drwxrwxr-x 4 student student 4096 nov 9 2021 01-filesystem drwxrwxr-x 4 student student 4096 nov 9 2021 02-process drwxrwxr-x 5 student student 4096 nov 9 2021 03-user drwxrwxr-x 4 student student 4096 nov 9 2021 04-appdev drwxrwxr-x 4 student student 4096 nov 9 2021 05-cli drwxrwxr-x 4 student student 4096 nov 9 2021 06-scripting drwxrwxr-x 4 student student 4096 nov 9 2021 07-hardware-obsolete drwxrwxr-x 5 student student 4096 nov 9 2021 07-networking drwxrwxr-x 4 student student 4096 nov 9 2021 08-security drwxrwxr-x 4 student student 4096 nov 9 2021 08-storage-obsolete drwxrwxr-x 3 student student 4096 nov 9 2021 09-task-admin drwxrwxr-x 4 student student 4096 nov 9 2021 11-ctf
Calea /home/student/uso-lab.git/labs/
este validă oricare ar fi calea curentă (oriunde ne-am afla în ierarhia de fișiere).
În acest caz, este mai eficient să folosim calea relativă. În cazul în care putem ajunge mai repede de la directorul rădăcina /
la directorul țintă, este mai utilă calea absolută.
Referim aceleași fișiere (/usr/bin/touch
și /etc/passwd
) prin cale relativă, folosind ls
:
student@uso:~$ pwd /home/student student@uso:~$ ls -l ../../usr/bin/touch lrwxrwxrwx 1 root root 10 Mar 14 2015 ../../usr/bin/touch -> /bin/touch student@uso:~$ ls -l ../../etc/passwd -rw-r--r-- 1 root root 1768 Sep 9 14:07 ../../etc/passwd
Observăm că ne aflăm la calea /home/student
și urcăm spre vârful ierarhiei de fișiere folosind caracterele ..
.
Odată ajunși la directorul rădăcină /
, coborâm spre fișierul touch
, trecând prin directoarele usr
și bin
.
..
ca punct punct, nu două puncte : pentru a elimina confuziile.
pwd
./lib/
, /home
, /bin/cat
atât prin cale relativă, cât și prin cale absolută.
Plasarea noastră într-un alt director decât cel curent înseamnă schimbarea căii curente. Facem acest lucru folosind comanda cd
(change directory):
student@uso:/etc$ pwd /etc student@uso:/etc$ cd /usr student@uso:/usr$ pwd /usr
Am schimbat calea curentă de la /etc
la /usr
. Această comandă poate fi folosită oriunde ne-am afla, deoarece este o cale absolută.
cd
schimbă promptul terminalului; aceasta este o indicație a directorului curent în care ne aflăm:
student@uso:/etc$ pwd
ne aflăm în etc
student@uso:/usr$ pwd
ne aflăm în usr
cd
primește ca parametru o cale. Aceasta poate fi atât relativă cât și absolută.
Schimbăm calea curentă în /home/student
, folosind cd
:
student@uso:/usr$ cd /home/student student@uso:~$ pwd /home/student
Fiind la calea /usr
, am folosit utilitarul cd
împreună cu o cale absolută /home/student
pentru a schimba calea curentă. Cea de-a doua comandă pwd
confirmă că am schimbat calea curentă.
Acum ne aflăm la calea /home/student
. O alternativă mai puțin eficientă este să facem schimbarea căii curente în doi pași, astfel:
student@uso:~$ cd /home student@uso:/home$ pwd /home student@uso:/home$ cd student/ student@uso:~$ pwd /home/student
Schimbăm calea curentă la /usr/bin
folosind cale relativă:
student@uso:~$ pwd /home/student student@uso:~$ cd ../../usr/bin student@uso:/usr/bin$ pwd /usr/bin
pwd
; ne deplasăm în altă parte folosind comanda cd
.
Observăm cum am urcat în ierarhie folosind ..
până la /
(directorul rădăcină) iar apoi am coborât spre usr
și apoi bin
.
În exemplul de mai jos, comanda de mai sus nu este valabilă:
student@uso:~/Desktop$ pwd /home/student/Desktop student@uso:~/Desktop$ cd ../../usr/bin bash: cd: ../../usr/bin: No such file or directory
Observăm că suntem la calea /home/student/Desktop
. Executând comanda cd ../../usr/bin
de mai sus, am ajunge la calea /home/usr/bin
care nu există.
/usr/bin
. Folosiți cale absolută./etc/
. Folosiți cale relativă./etc/network/
. Folosiți cale relativă.
Funcția de tab completion este probabil una dintre cele mai utile funcții expuse de către shell. Prin simpla apăsare a tastei Tab
în timp ce scriem numele unei comenzi, al unei opțiuni a unei comenzi sau calea către un director sau fișier, shellul va completa în mod automat textul sau va sugera opțiuni de auto-complete.
Observăm că atunci când calea pe care o scriem se termină cu / (slash), apăsând de 2 ori pe tasta Tab
ne arată fișierele și directoarele din calea respectivă. Atunci când vrem să ne auto-completeze numele, apăsăm o singură dată pe tasta Tab
.
Tasta Tab
este descrisă în detaliu în laboratorul Îmbunătățirea lucrului în linia de comandă.
Pentru o eficiență mai bună, putem folosi simboluri pentru interacțiunea cu utilitarul cd
:
-
) pentru a referi la calea anterioară,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
Observăm că, dacă folosim repetat comanda cd -
, vom face un joc du-te-vino (ping-pong) între 2 directoare.
~
) pentru a referi directorul home a utilizatorului.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
~
pentru a indica acest lucru.