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.
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ă.
/home/student/uso_lab02
folosind comanda:
student@uso:~$ mkdir /home/student/uso_lab02/ student@uso:~$ cd /home/student/uso_lab02/ student@uso:~/uso_lab02$ pwd /home/student/uso_lab02
Un exemplu de ierarhie de fișiere este în secțiunea Căi în ierarhia de fișiere.
Pentru a vedea fișierele sub formă arborescentă, folosim comanda tree
.
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
Î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-lab
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-lab -rw-r--r-- 1 student student 4827 aug 21 2018 vm-actions-log.txt
Interpretăm rezultatele de mai sus:
-
ne arată că examples.desktop
este un fișier obișnuit. Primul caracter d
ne arată că Desktop
este director.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ă.student
, se referă tot la permisiuni și ownership; le vom discuta într-un capitol ulteror. 8980
arată dimensiunea fișierului examples.desktop
. Observăm că directorul Desktop
are dimensiunea de 4096 octeți (bytes);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 in 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.
Ce se va întâmpla dacă executăm touch
pe un fișier existent?
Creăm un nou fișier cu numele romania
folosind comanda touch
:
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 student@uso:~/uso_lab02$ touch 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:06 romania
În continuare avem tot 3 fișiere în plus în directorul ~/uso_lab02
. Ne uităm la liniile -rw-rw-r-- 1 student student 0 oct 12 01:05 romania
(de dinainte) și -rw-rw-r-- 1 student student 0 oct 12 01:06 romania
(de după) și vedem că diferă timpul. Este vorba despre timpul la care a fost ultima dată accesat fișierul romania
.
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, creăm câte un director pentru fiecare materie și 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 directoarele GameOfThrones
și Avengers
în directorul ~/uso_lab02
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
WinnieThePooh
și unul numit TomSiJerry
.Iron Man
, Hulk
, Thor
, Captain America
(cu spațiu) în directorul Avengers
; afișați fișierele din director;Arya
, Daenerys Targaryen
(cu spațiu), Jon Snow
, Tyrion Lannister
în directorul GameOfThrones
; afișați fișierele din director.
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
. Etimologia comenzii provine din engleză - remove directory.
Creăm directorul “LordOfTheRings” folosind comanda mkdir
după care îl ștergem folosind comanda rmdir
:
student@uso:~/uso_lab02$ mkdir LordOfTheRings 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 drwxr-xr-x 2 student student 4096 Sep 29 18:09 LordOfTheRings (...) student@uso:~/uso_lab02$ rmdir LordOfTheRings student@uso:~/uso_lab02$ 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:~/uso_lab02$ 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:~/uso_lab02$ 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:~/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 ThroneOfGames
(cu tot conținutul acestuia) la calea /tmp/
folosind comanda mv
:
student@uso:~/uso_lab02$ ls Avengers GameOfThrones student@uso:~/uso_lab02$ mv ThroneOfGames/ /tmp/ student@uso:~/uso_lab02$ ls /tmp/ ThroneOfGames ssh-ApUMKI3HSJ student@uso:~/uso_lab02$ ls Avengers
Acum directorul ThroneOfGames
se află în calea /tmp/ThroneOfGames
. Am verificat folosind ls
că nu se mai află în directorul curent și că există în directorul /tmp/
.
Mutăm înapoi directorul ThroneOfGames
(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/ThroneOfGames/ /home/student/uso_lab02 student@uso:~/uso_lab02$ ls Avengers ThroneOfGames
Am verificat că directorul ThroneOfGames
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/
.NBA
în directorul de la calea /home/student/uso_lab02
.MichaelJordan
, LeBronJames
, DwayneWade
și KobeBryant
în directorul NBA
.NBA
(împreună cu întreaga ierarhie de fișiere) în directorul Vikings
.ThroneOfGames
în ThronesInTheGame
.ThronesInTheGame
în /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 ThronesInTheGame (...)
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.
Afișăm conținutul directorului părinte folosind ls -l
:
student@uso:~/uso_lab02$ student@uso:~/uso_lab02$ ls -l .. total 60 drwxr-xr-x 2 student student 4096 aug 6 2018 Desktop (...)
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 ThronesInTheGame 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 ThronesInTheGame (...)
Am creat directorul ascuns .LordOfTheRings
.
.LordOfTheRings
în directorul de la calea /home/student/uso_lab02
.Aragorn
, Legolas
, Frodo Baggins
.stiri
în directorul de la calea /home/student/uso_lab02
.hotnews
, biziday
, digi24
..cancan
.tv
în directorul de la calea /home/student/uso_lab02
.ProTV
, Digi24
, Eurosport
.Antena3
, Romania24
.stiri
împreună cu fișierele de sub acesta în directorul tv
..Antena3
și .Romania24
în directorul /tmp
.O ierarhie de fișiere este formată din directoare și fișiere. Fișierele pot fi de mai multe tipuri: text, binare, imagini, arhive, etc.
Pentru a afla tipul fișierului folosim comanda file
:
student@uso:~$ file examples.desktop examples.desktop: UTF-8 Unicode text student@uso:~$ file /usr/bin/touch /usr/bin/touch: symbolic link to /bin/touch student@uso:~$ file /bin/touch /bin/touch: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=788ca30f103a97f230adfaa558210b6df09cb7c8, stripped
Observăm că fișierul examples.desktop
este un fișier de tipul UTF-8 în ciuda extensiei, /usr/bin/touch
este o legătură simbolică, iar /bin/touch
este un fișier binar.
Vom prezenta mai multe detalii în capitolul Îmbunătățirea lucrului în linia de comandă.
~
)./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/test (...) 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 (my_link
), nu s-a șters și la destinație (/home/student/uso_lab02/test
).
/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).
O acțiune foarte des întâlnită este modificarea unor fișiere. Fie că scriem în jurnal, facem un TODO list sau scriem cod, trebuie să scriem într-un fișier. Pentru a modifica un fișier, folosim un program numit editor de text. Există două tipuri de editoare de text: editoare în mod grafic sau editoare în linie de comandă. Vom detalia în continuare aceste două categorii.
Editoarele în linia de comandă sunt făcute pentru interacțiunea cu terminalul. Acestea asigură funcționalitați restrânse de formatare în comparație cu editoarele grafice. Nu există butoane fizice; de obicei comenzile se dau prin combinații de taste.
Un alt caz în care folosim editoarele în linie de comandă este lucrul la distanță. Atunci când ne conectăm remote la un server și nu avem interfață grafică, utilizarea unui editor în linie de comandă este necesară.
Există editoare mai puternice vim, emacs care permit automatizarea unor sarcini precum cele de mai sus.
Un editor în linie de comandă uzual folosit este nano. Acesta are funcționalități de bază și este ușor de folosit.
În continuare vom folosi nano
pentru a interacționa cu un fișier.
În exemplul de mai sus am deschis fișierul avengers
cu nano
. În urma comenzii, s-a creat fișierul dacă acesta nu exista. Am adăugat numele a 4 supereroi și am salvat folosind combinația de taste Ctrl+x
după care a apărut întrebarea dacă vrem să salvăm modificările. În partea de jos apare optiunea de Y
es și N
o. Apăsând pe tasta Y
, ne cere să trecem numele fișierului, după care să confirmăm cu tasta Enter.
O listă de comenzi utile găsim la cheatsheet nano.
În continuare vom exemplifica scurtături cu ajutorul combinațiilor de taste pentru a spori eficiența.
US Presidents
și completați fișierul cu cel puțin 3 președinți ai Statelor Unite are Americii./home/student/uso_lab02
./home/student/uso_lab02
.Make USO Great Again!
.Folosite în mod uzual de utilizatori non-tehnici, aceste tipuri de editoare au o interfață grafică ce permit modificarea fișierelor într-un mod cât mai ușor, facil.
Poate cel mai folosit editor din această categorie este Microsoft Word. Scopul acestuia este ușurința în folosință: există multe capabilități (culori, mărime font, stil, aranjare în pagină) pentru crearea de conținut, iar opțiunile sunt ușor de găsit și folosit. Un alt editor de text este Notepad++. Acesta este mai simplu, cu mai puține opțiuni.
Un editor foarte folosit pentru programare este Sublime. Acesta este și editorul grafic recomandat de noi.
Editoarele grafice sunt populare și pentru programare. Acestea oferă capabilități diverse pentru a ajuta un programator să scrie cod mai ușor, facil. De exemplu:
Printr-o singură apăsare de buton, se pornește simulatorul de iPhone și se execută aplicația.
Alte editoare grafice: Sublime, gedit, Visual Studio.
Mai jos este un exemplu de interacțiune cu editorul Pages, un editor de text de la Apple. Editarea documentelor este simplă, intuitivă și cu multe opțiuni.
Putem adăuga text foarte intuitiv. Am modificat dimensiunea, culoarea, fontul textului foarte ușor. Aceasta este puterea unui editor grafic.
Însă, pentru programare nu este deloc util; vom folosi sublime
.
Deschiderea unui fișier se poate face atât din linia de comandă student@uso:~$ subl fișier
O listă de comenzi utile găsim aici; le executăm în continuare:
Folosim combinația de taste Ctrl+x
pentru cut:
Folosim combinația de taste Ctrl+u
pentru undo, iar pentru a șterge de la cursor până la începutul liniei Ctrl+k Ctrl+backspace
:
Indentarea se face cu Ctrl+[
și Ctrl+]
:
Duplicăm o linie folosind Shift+Ctrl+d
:
Pentru a compila cod folosim combinația de taste Ctrl+b
:
Romanian Presidents
și completați fișierul cu cel puțin 3 președinți ai României.home
.Make USO Great Again!
.Ctrl+b
.student@uso:~$ pwd /home/student
Cale relativă:
student@uso:~$ ls -l uso-lab/labs/ (...)
Cale absolută:
student@uso:~$ ls -l /home/student/uso-lab/labs/ (...)
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 -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
student@uso:~/uso_lab02/Avengers$ ls Captain America Iron Man Thor
student@uso:~/uso_lab02$ 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:~/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
student@uso:~/uso_lab02$ mkdir GameOfThrones student@uso:~/uso_lab02$ mkdir Avengers student@uso:~/uso_lab02$ 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:~/uso_lab02$ cat GameOfThrones/Arya A girl has no name
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
student@uso:~/uso_lab02$ mkdir LordOfTheRings student@uso:~/uso_lab02$ 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:~/uso_lab02$ rmdir "LordOfTheRings" student@uso:~/uso_lab02$ 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:~/uso_lab02$ ls GameOfThrones student@uso:~/uso_lab02$ mv GameOfThrones ThroneOfGames student@uso:~/uso_lab02$ ls ThroneOfGames
student@uso:~/uso_lab02$ cp Avengers/Thor /tmp/ student@uso:~/uso_lab02$ ls /tmp/ Thor ssh-ApUMKI3HSJ
student@uso:~/uso_lab02$ ls -al total 8 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
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
student@uso:~/uso_lab02$ file Picture.abc Picture.abc: PNG image data, 742 x 320, 8-bit/color RGBA, non-interlaced student@uso:~/uso_lab02$ file index.rst index.rst: ASCII text student@uso:~/uso_lab02$ file archive.tar archive.tar: POSIX tar archive (GNU)
student@uso:~/uso_lab02$ ln -s ~/ . student@uso:~/uso_lab02$ ls -l total 0 lrwxrwxrwx 1 student student 28 Oct 6 17:58 mkdir -> /home/student/
student@uso:~/uso_lab02$ ./my_ls executie mkdir my_ls touch