Laborator 02 - Utilizarea sistemului de fișiere. Comenzi de bază.

Utilizare terminal

În Ubuntu GNOME 16.04 pentru a deschide un terminal nou:

Scurtătură Descriere
Ctrl+ALT+t pentru a o nouă fereastră de terminal

Puteți folosi următoarele scurtături în terminal:

Scurtătură Descriere
Ctrl+Shift+t pentru a deschide un nou tab
Ctrl+PageDown pentru a merge la tab-ul urmator
Ctrl+PageUp pentru a merge la tab-ul precedent
Alt+<index> pentru a sări direct la un tab
Ctrl+d pentru a închide un tab (sau comanda exit)

Pentru a naviga (scrolling) în cadrul unui terminal, mai ales atunci când o comandă afișează mult text, folosiți următoarele scurtături:

Scurtătură Descriere
Shift+PgDown pentru a derula în jos
Shift+PgUp pentru a derula în sus

Alte scurtături utile:

Scurtătură Descriere
Ctrl+Shift+c copiere text din terminal
Ctrl+Shift+v lipire text în terminal
Shift+Insert lipire text în terminal

Cea mai importantă formă de documentație în Linux, atunci când nu avem acces la Internet, o reprezintă paginile de manual, accesibile cu ajutorul comenzii man.

De exemplu, pentru a afișa informații despre comanda echo (comandă ce afișează un mesaj la ieșirea standard), vom folosi comanda:

student@uso:~$ man echo 

Paginile de manual sunt adesea de mari dimensiuni și avem nevoie să le parcurgem rapid (să navigăm prin ele). Pentru aceasta, după ce deschidem pagina de manual a unei comenzi, putem folosi combinațiile de taste de mai jos pentru a nagiva în pagină:

Tastă Scurtă descriere
/string_to_search / (adică tasta slash) e folosită pentru a căuta string_to_search în pagina de manual
n (next) pentru a merge la următoarea apariție a cuvântului căutat cu /
N (Shift + n) pentru a merge la precedenta apariție a cuvântului
q (quit) pentru a închide pagina de manual
Enter pentru a derula în jos o linie
f (forward) sau Space pentru a derula în jos un ecran
b (backward) pentru a derula în sus un ecran
d (down) pentru a derula în jos jumătate de ecran
u (up) pentru a derula în sus jumătate de ecran

Suport laborator

Pentru a obține informații detaliate despre noțiunile și tehnicile din acest laborator, recomandăm să consultați următoarele secțiuni din cartea de suport a cursului USO:

Obiective laborator

  • Familiarizarea cu linia de comandă în Linux
  • Familiarizarea cu comenzi simple în Bash (terminalul din Linux)
  • Utilizarea comenzilor pentru operațiuni similare realizate până acum din interfața grafică
  • Înțelegerea diferenței dintre căi relative și căi absolute

Pe scurt despre Git

Pe parcursul laboratoarelor, pentru descărcarea fișierelor necesare laboratorului, vom folosi Git.

Git este un sistem de source control management și e folosit pentru versionarea codului în proiectele software mari.

Celor interesați să aprofundeze conceptele din spatele comenzii git, precum și utilizări avansate, le recomandăm cursul practic online de pe gitimmersion.

Demo

Pentru început, vrem să ne acomodăm cu cele mai importante comenzi din linia de comandă, în special cele care lucrează cu fișiere și directoare. Îndrumați de asistent, vom descoperi împreună cum putem folosi linia de comandă pentru a lucra cu sistemul de fișiere și pentru a face acțiuni mai rapid ca în interfața grafică.

Avem și un cheatsheet pe care îl putem folosi ca să ne reamintim cele mai frecvente comenzi.

Să începem!

Deschideți un terminal. Clonați conținutul repository-ului oficial uso folosind comanda de mai jos:

student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso 

Ne propunem să lucrăm cu acele comenzi care ne ajută să parcurgem directoarele din sistemul de fișiere (adică să-l traversăm). Apoi să folosim comenzile pentru listarea conținutului unui director și pentru afișarea conținutului unui fișier.

Foarte importantă este distincția între o cale absolută (o cale către un director care pornește din directorul rădăcină, exemplu: /home/student) și o cale relativă la directorul curent (folosind intrările speciale . - directorul curent și .. - directorul părinte).

Urmăriți cu atenție secvența de comenzi de mai jos. Dacă vreți să dați și voi comenzile pe stația la care lucrați, folosiți cât mai des tasta TAB atunci când dați un parametru comenzii ls sau cd.

[student@uso demo]$ pwd
/home/student/uso/lab02/demo
 
[student@uso demo]$ tree .
.
|-- ac_dc
|   |-- angus
|   |-- bon
|   |-- brian
|   |-- chris
|   |-- cliff
|   |-- dave
|   |-- george
|   |-- malcom
|   |-- mark
|   `-- phil
|-- cargo
|-- hammerfall
|   |-- anders
|   |-- jesper
|   |-- joacim
|   |-- magnus
|   |-- oscar
|   |-- pontus
|   `-- stefan
|-- iris
|-- metallica
|-- nightwish
|-- nirvana
|-- phoenix
`-- slayer

Acum că am văzut structura directoarelor, haideți să navigăm prin ele:

[student@uso demo]$ cd ac_dc  # aici am folosit o cale relativă la directorul curent
[student@uso ac_dc]$ ls
angus  bon  brian  chris  cliff  dave  george  malcom  mark  phil
[student@uso ac_dc]$ cd .. # Am navigat în directorul părinte directorului ac_dc, care este /home/student/uso/lab02/demo
[student@uso demo]$ ls -R    
.:
ac_dc  cargo  hammerfall  iris  metallica  nightwish  nirvana  phoenix  slayer
 
./ac_dc:
angus  bon  brian  chris  cliff  dave  george  malcom  mark  phil
 
./hammerfall:
anders  jesper  joacim  magnus  oscar  pontus  stefan
 
./metallica:
 
./nirvana:
[student@uso demo]$ cd /home/student/uso/lab02/demo/hammerfall # am fi putut folosi și cd hammerfall, dar am folosit cale absolută
[student@uso hammerfall]$ ls
anders  jesper  joacim  magnus  oscar  pontus  stefan

Lui ls îi putem da argument atât o cale relativă către un director sau un fișier, cât și o cale absolută:

[student@uso hammerfall]$ ls ../ac_dc   
angus  bon  brian  chris  cliff  dave  george  malcom  mark  phil
 
[student@uso hammerfall]$ ls -l ../ac_dc/brian
-rw-r--r-- 1 student all 0 Oct 17 08:56 ../ac_dc/brian
 
[student@uso hammerfall]$ ls -l ./anders
-rw-r--r-- 1 student all 0 Oct 17 08:56 ./anders
 
[student@uso hammerfall]$ ls -l anders
-rw-r--r-- 1 student all 0 Oct 17 08:56 anders
 
[student@uso hammerfall]$ ls -l /home/student/uso/lab02/demo/hammerfall/oscar  
-rw-r--r-- 1 b46099 all 0 Oct 17 08:56 /home/student/uso/lab02/demo/hammerfall/oscar

Mare atenție la căile relative vs. cele absolute. O cale relativă este o cale raportată la directorul curent, în timp ce o cale absolută este raportată la directorul rădăcină (/). O cale relativă începe, de obicei, cu un nume, cu . sau cu .., în timp ce o cale absolută începe întotdeauna cu /. De reținut faptul că și ~/uso este tot o cale absolută, chiar dacă începe cu caracterul ~, acest lucru fiind datorat faptului că ~ este doar un alias către directorul home al utilizatorului curent (/home/student).

Cum am văzut și mai sus, exemple de folosire a căilor relative sunt:

Țineți cont de folosirea tastei TAB.

[student@uso demo]$ ls hammerfall        # ls h<TAB>
[student@uso demo]$ ls -l .
[student@uso demo]$ cd ./ac_dc           # cd ./a<TAB>
[student@uso ac_dc]$ ls ../hammerfall    # ls ../h<TAB>
[student@uso ac_dc]$ ls ../../demo/iris  # ls ../../d<TAB>/i<TAB>

Câteva exemple de utilizare a căilor absolute:

[student@uso demo]$ ls /
[student@uso demo]$ tree /home/student/uso/lab02/demo/hammerfall   # ls /h<TAB>/stu<TAB>/uso/demo/h<TAB>
[student@uso demo]$ ls -l ~/uso/lab02/demo/hammerfall              # ls ~/uso/lab02/d<TAB>/h<TAB>
[student@uso demo]$ tree -L 1 ~

Acum să vedem câteva erori care pot să apară. Ce credeți că se întâmplă mai jos? Care este cauza erorii apărute, ce greșeală a fost făcută?

[student@uso hammerfall]$ ls -l brian
ls: cannot access brian: No such file or directory
 
[student@uso hammerfall]$ cd ..
[student@uso demo]$ cd nightwish
-bash: cd: nightwish: Not a directory
 
[student@uso demo]$ cd /home/student/uso/lab02/demo/scorpions
-bash: cd: /home/student/uso/lab02/demo/scorpions: No such file or directory
 
[student@uso demo]$ cd metallica
[student@uso metallica]$ cd ..
[student@uso demo]$ cd /nirvana
-bash: cd: /nirvana: No such file or directory

Citiți cu atenție mesajele erorilor din Bash ori de câte ori o comandă nu funcționează. Oferă suficiente indicii despre rădăcina erorii.

În general, orice comandă cd ar trebui urmată de una ls sau pwd în scop de verificare. Cum am văzut mai sus, uneori pot apărea erori, fie directorul nu există, fie nu avem permisiuni să îl accesăm, iar comanda se poate executa fără succes, prin urmare este foarte important care orice comandă de modificare/alterare a stării curente să fie urmată de una de verificare. Câteva exemple de comenzi care fac pereche bună sunt: cdpwd; touch, mv, rmls; echocat etc.

Folosiți tasta TAB ori de câte ori puteți. De multe ori e suficient să tastăm doar primele 2-3 litere din numele directorului sau fișierului pe care vrem să-l accesăm. Dacă există două sau mai multe directoare/fișiere care au același prefix, putem fie adăuga mai multe litere pentru a elimina ambiguitatea, fie tasta de două ori TAB pentru a afișa lista de hituri cu același prefix. Putem itera apoi prin lista de potriviri folosind tot tasta TAB. Urmăriți exemplele de mai jos.

[student@uso demo]$ ls h<TAB>
anders jesper joacim magnus oscar  pontus stefan
 
[student@uso demo]$ cd ac_<TAB>
 
[student@uso ac_dc]$ ls c<TAB><TAB>
chris  cliff
 
[student@uso ac_dc]$ ls ch<TAB>
chris

2. Utilitarul tree

Unul dintre utilitarele de bază este tree, care poate lista conținutul directoarelor într-un format arborescent, fiind mai ușor de urmărit și înțeles organizarea sistemului de fișiere. De cele mai multe ori este suficientă o simplă comandă ls, dar dacă vrem să vizualizăm și nivelurile inferioare din ierarhia de fișiere și directoare, tree poate fi foarte util.

Utilizat fără argumente, tree va lista toate fișiere și directoarele aflate sub directorul curent (.).

[student@uso demo]$ tree
.
├── ac_dc
│   ├── angus
│   ├── bon
│   ├── brian
│   ├── chris
│   ├── cliff
│   ├── dave
│   ├── george
│   ├── malcom
│   ├── mark
│   └── phil
├── cargo
├── hammerfall
│   ├── anders
│   ├── jesper
│   ├── joacim
│   ├── magnus
│   ├── oscar
│   ├── pontus
│   └── stefan
├── iris
├── nightwish
├── phoenix
└── slayer
 
2 directories, 22 files

tree poate primi ca argument unul sau mai multe directoare și le va lista, independent, pe fiecare.

[student@uso demo]$ tree hammerfall ac_dc
hammerfall
├── anders
├── jesper
├── joacim
├── magnus
├── oscar
├── pontus
└── stefan
ac_dc
├── angus
├── bon
├── brian
├── chris
├── cliff
├── dave
├── george
├── malcom
├── mark
└── phil
 
0 directories, 17 files

În cazul în care dorim să afișăm un director care conține foarte multe fișiere și subdirectoare, putem limita nivelul până la care se face listarea folosind argumentul -L.

[student@uso demo]$ tree -L 1
.
├── ac_dc
├── cargo
├── hammerfall
├── iris
├── nightwish
├── phoenix
└── slayer
 
2 directories, 5 files

De notat faptul că tree poate să nu primească niciun argument sau, dacă primește, acesta trebuie să fie neapărat director, în caz contrar se va afișa o eroare.

[student@uso demo]$ tree iris
iris [error opening dir]

3. Pagini de manual

În Linux, probabil cea mai folosită formă de documentație o reprezintă paginile de manual. Haideți să vedem care sunt comenzile pe care le folosim pentru a ne documenta în Linux și cum găsim informația utilă.

Căutarea unei comenzi:

student@mint ~ $ apropos "remove files"
student@mint ~ $ apropos "copy files"

Localizarea unei comenzi:

student@mint ~ $ which dpkg

Localizare binar, sursă, dar și fișierele de care se folosește pagina de manual:

student@mint ~ $ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

4. Operații pe fișiere și directoare

Acum că știm să navigăm sistemul de fișiere, dorim să și creăm fișiere și directoare. Haideți să vedem cu ce comenzi putem crea, copia, muta și șterge fișiere și directoare.

5. Wildcards

Poate vi se pare că durează mult să scrieți comenzi și că ați fi folosit mai ușor interfața grafică. Ei bine, linia de comandă are caractere speciale (de tipul wildcards) cu care putem face dintr-o singură comandă o acțiune pe mai multe fișiere. Să vedem cum putem face aceste lucru.

Să se listeze conținutul tuturor fișierelor cu extensia *.conf din /etc:

 ls /etc/*.conf 

Determinarea distributiei de Linux (de obicei nu stim exact cum se numește fișiereul, dar știm sigur că acesta conține cuvântul cheie release)

cat /etc/*release*

6. Bonus/Extra: redirect stuff

Dacă ne mai rămâne timp în partea de demo, hai să discutăm despre o caracteristică foarte interesantă și utilizată din linia de comandă: redirectarea în fișiere. Adică posibilitatea ca output-ul unei comenzi să fie scris într-un fișier de unde să fie inspectat mai târziu.

student@uso:~$ ls > shaorma_files
student@uso:~$ cat shaorma_files

Dacă vom folosi aceasta redirectare din nou, ce se va întâmpla cu fișierul shaorma_files ?

student@uso:~$ echo "hello" > shaorma_files 

Dacă nu vrem să pierdem un conținut anterior, folosim append mode:

student@uso:~$ cat /etc/passwd >> shaorma_files
student@uso:~$ echo "uso rules" >> shaorma_files 
student@uso:~$ cat shaorma_files

7. Scurtă recapitulare

Haideți să recapitulăm lucrurile pe care le-am făcut în această sesiune de demo:

  • Am folosit comenzi simple de navigare prin sistemul de fișiere: cd, pwd, ls, tree.
  • Am văzut cum folosirea tastei TAB poate reduce considerabil timpul de tastare a comenzilor.
  • Am văzut cum putem consulta documentația pe Linux și cum putem căuta informația în paginile de manual.
  • Am creat fișiere și directoare folosind comenzi precum mkdir, touch, cp, mv. Pentru a le șterge, am folosi rm și rmdir.
  • Am învățat că orice comandă de alterare trebuie urmată de una de verificare (rm && ls).
  • Am folosit wildcard-uri de forma * pentru a executa acțiuni simultan pe mai multe fișiere, lucru mai dificil de realizat în interfața grafică.
  • Am văzut cum putem folosi redirectarea în fișiere folosind operatorii >, >> și <.

Exerciții

Când lucrați la exerciții, atât la laborator, cât și la testul practic, fiți atenți în ce director vă aflați atunci când citiți cerința, dar și când le rezolvați. Cel mai sigur este să folosiți comanda

 student@uso:~$ pwd 

Semnificația este print working directory

1. Utilizare Git (1p)

Verificați că sunteți în directorul home al utilizatorului student (adică directorul /home/student). Investigați promptul (să conțină caracterul ~ (tildă) pentru directorul home) sau folosiți comanda pwd:

student@uso:~$ pwd
/home/student

Acum că știți că vă aflați în directorul home al utilizatorului student, clonați conținutul repository-ului oficial uso

student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso 

Observați că a fost creat un director numit uso în /home/student. Mesajul comenzii git clone ne informează despre acest lucru (vedeți prima linie din output):

Cloning into 'uso'...
remote: Counting objects: 54, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 54 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (54/54), done.

Directorul uso a fost creat relativ (folosind o cale relativă) la directorul curent (care în cazul nostru era /home/student)

În urma comenzii de mai sus a apărut directorul uso în directorul home al utilizatorului student.

student@uso:~$ ls
... uso ...

Folosiți comanda cd și schimbați directorul în directorul subdirectorul uso/lab02. În subdirectorul uso/lab02 găsiți structura de directoare și fișierele necesare pentru rezolvarea laboratorului

2. Structura sistemului de fișiere (2p)

Redenumiți directorul clonat /home/student/uso în /home/student/uso-repository din linie de comandă.

Amintiți-vă din secțiunea de demo sau din USO Cheatsheet cu ce comandă putem redenumi fișiere sau directoare.

Următoarele exerciții vor presupune că există în directorul /home/student un director numit uso-repository. Asigurați-vă că sunteți în directorul corect, atenție la căi relative și absolute. Când cerința spune Vă aflați în directorul X, folosiți comanda cd X pentru a intra în acel director. X va fi în general o cale absolută

  • Vă aflați în directorul /home/student.
  • Intrați în directorul uso-repository/lab02, clonat la exercițiul anterior.
  • Ne dorim să vedem toate fișierele și sub-directoarele ale directorului curent. Pentru aceasta avem două opțiuni:
    1. Folosirea unui argument al comenzii ls:
       student@uso:~/lab02 $ ls -R 
    2. Outputul comenzii ls -R nu este foarte ușor de urmărit pentru directoare cu multe intrări. Pentru a vizualiza structura arborescentă mai prietenos, putem folosi tree.

E posibil ca tree să nu existe în sistem. Outputul comenzii va fi, atunci:

student@uso:~/uso-repository $ tree
bash: tree: command not found...

În acest caz, e nevoie să o instalăm:

student@uso:~$ sudo apt-get install tree

3. Dimensiunea fișierelor (2p)

Ne dorim să aflăm dimensiunile fișierelor. Vă aflați în /home/student. Intrați în directorul uso-repository/lab02

Listați conținutul detaliat al directoarelor

student@uso:~$ ls -l 

Care coloană credeți că ne oferă informații despre dimensiune? Outputul comenzii oferă dimensiunea în octeți (bytes) și este mai greu de citit.

Folosiți un extra-argument al comenzii ls pentru a avea dimensiunile în format human-readable. Căutați în pagina de manual a comenzii ls

student@uso:~$ man ls 

după cuvântul cheie human. Folosiți argumentul descoperit în conjuncție cu -l.

Directorul uso-repository/lab02/anul_1/programare/teme conține foarte multe fișiere, de dimensiuni mari, e imposibil ca acesta să aibă doar 4K dimensiune. Pentru a determina dimensiunea directoarelor, trebuie să folosim o altă comandă, du (de la disk usage).

Iată un exemplu:

 student@uso:~$ du uso-repository/lab02/anul_1/programare/teme 

Exercițiu: determinați doar dimensiunea directorului uso-repository/lab02/anul_1/programare/teme (nu și a subdirectoarelor) în format human readable. Căutați în

 student@uso:~$ man du 

după cuvântul cheie summarize și identificați opțiunea (argumentul) comenzii du care vă afișează dimensiunea directorului în format sumarizat.

4. Ștergerea fișierelor (2p)

Vă aflați în directorul /home/student/uso-repository.

Ștergeți fișierul crap.txt din directorul lab02/anul_1/uso.

Observați că am folosit o cale relativă la directorul /home/student. Am fi putut folosi și

rm -f /home/student/uso-repository/lab02/anul_1/uso/crap.txt

Încercați să ștergeți directorul to_delete din uso. De ce nu putem folosi comanda de mai jos, chiar dacă ea conține calea corectă, absolută?

rm -f /home/student/uso-repository/lab02/anul_1/uso/to_delete 

Căutați în pagina de manual a rm (man rm) după recursive.

Intrați în directorul lab02/anul_1/uso. Încercați să ștergeți directorul empty_dir. Folosiți comanda

rmdir empty_dir 

De ce nu putem șterge empty_dir prin această metodă? Intrați în directorul empty_dir și investigați dacă acesta conține fișiere (e posibil să conțină fișiere ascunse!). Ștergeți fișierele din el, reveniți la directorul părinte și verificați dacă funcționează comanda rmdir empty_dir.

Pentru a șterge un director gol putem folosi oricare din următoarele comenzi:

student@uso:$ cd uso-repository
student@uso:$ rm -rf lab02/anul_1/uso/empty_dir
student@uso:$ rmdir lab02/anul_1/uso/empty_dir

rmdir este capabil doar să șteargă doar directoare goale.

Verificați execuția cu succes a comenzii de ștergere folosind una de listare, de exemplu ls.

5. Crearea unor fișiere cu denumiri complicate (2p)

Intrați în directorul uso-repository/lab02/anul_1/uso/filesys

Folosiți următoarea comandă:

mkdir Program Files and Accessories 

Listați conținutul directorului filesys. Câte directoare conține acesta. De ce? A fost acesta efectul dorit? Pentru a putea crea un director cu spații în numele său avem două alternative:

student@uso:$ mkdir "Program Files and Accessories"
student@uso:$ mkdir Program\ Files\ and\ Accessories

Nu tastați comanda din nou, folosiți tasta SAGEATA_SUS pentru a reveni la comanda anterioară, tastați ", Ctrl+A pentru a merge la începutul liniei, Alt+F pentru a avansa un cuvânt și, în final, tastați din nou .

Verificați că, într-adevăr, de data aceasta directorul creat are numele dorit folosind comanda ls.

Fără a intra în directorul creat, "Program Files and Accessories", creați 3 fișiere cu denumirile "Open Office", "Mozilla Firefox" și "Incredible long file name that contains a lot of spaces" precum și 2 directoare cu numele "App Data" și "Local Settings" în "Program Files and Accessories". Încercați, de asemenea, să folosiți cât mai mult tasta TAB.

Copiați primele două fișiere create anterior în directorul ../../programare/ (atenție! e o cale relativă de la directorul uso-repository/lab02/anul_1/uso/filesys).

Scrieți un text la întâmplare în fișierul "Incredible long file name that contains a lot of spaces" folosind comanda echo sau vim.

student@uso:$ echo "un text" > Inc<TAB>   # folosiți neapărat tasta TAB, nu tastați tot numele fișierului

Redenumiți fișierul "Incredible long file name that contains a lot of spaces" în "Incredible long file name that contains less spaces". Abuzați de tasta TAB. Încercați să folosiți cât mai puține taste.

Un mod rapid de rezolvare poate fi următorul. Tastăm mv urmat de combinația Alt+. , SPACE și iarăși Alt+. (combinația de taste Alt+. este o modalitate de a itera prin ultimii parametri ai comenzilor anterioare). Tastăm apoi Alt+b pentru a merge un cuvânt înapoi după care, folosind Alt+Backspace, ștergem cele 3 cuvinte care nu ne mai trebuie. În final, nu rămâne decât de adăugat textul "less\ ".

Copiați întregul director filesys în /home/student. De ce nu funcționează comanda de mai jos?

student@uso:$ pwd
/home/student/uso-repository/lab02/anul_1/uso/filesys
student@uso:$ cp . /home/student

Avem nevoie de recursive (ca la rm). Căutați în pagina de manual a cp (man cp) după recursive.

Intrați în directorul părinte lui filesys. Mutați directorul to_move în /tmp. Observați că pentru mv nu avem nevoie de parametrul -r (pentru recursivitate).

Verificați execuția cu success a comenzii folosind o comandă ls.

6. Căi relative vs. căi absolute (1p)

Mergeți în directorul /home/student/uso-repository/lab02/anul_1. Folosiți cât mai mult tasta TAB pentru a ajunge aici.

student@uso:~$ cd /home/st<TAB>/uso<TAB>/lab02/a<TAB>_1

Folosiți comanda tree pentru a investiga structura de directoare și fișiere din directorul curent. Mergeți apoi în directorul programare/teme folosind o cale relativă:

student@uso:~$ cd programare/teme

Verificați că vă aflați în directorul dorit folosind comanda pwd.

Fără a schimba directorul curent, deci fără a utiliza vreo comandă cd creați câte un fișier cu numele TODO în folderele uso, respectiv programare din directorul anul_1. Folosiți căi relative. Spre exemplu, pentru directorul programare putem proceda în felul următor:

student@uso:$ touch ../TODO

Realizați același lucru pentru directorul uso.

Mergeți acum tot în directorul uso folosind de data aceasta o cale absolută (trebuie să înceapă cu / sau ~). Editați fișierul TODO creat anterior folosind editorul vim astfel încât la final să conțină textul "O sa iau nota 10 la USO".

Verificați faptul că fișierul conține textul dorit folosind comanda cat care afișează conținutul fișierului pe ecran.

Copiați fișierul TODO din directorul uso peste cel din directorul programare. Încercați să folosiți cât mai puține taste și doar căi relative.

BONUS

1. Vimtutor (1 karma WoUSO)

De multe ori suntem nevoiți să edităm fișiere direct în linia de comandă, fără ajutorul interfeței grafice (ex. atunci când suntem logați pe un server printr-o sesiune la distanță, așa cum vom avea la examenul practic). Unul dintre cele mai populare editoare în linia de comandă este vim. Pe parcursul semestrului veți întâlni de multe ori în cadrul laboratorului de USO (și nu numai) mențiuni către vim și, de asemenea, este foarte probabil ca la testele practice sau examenul final să fiți nevoiți să-l folosiți datorită lipsei unei interfețe grafice instalate.

Pentru a ușura procesul de învățare a comenzilor de bază în vim, există vimtutor, un tutorial foarte pe larg în linie de comandă. Porniți vimtutor folosind comanda cu același nume

student@uso:~$ vimtutor

și parcurgeți primele 3 lecții de acolo.

Citiți cu atenție tot textul, parcurgeți-l linie cu linie fără a sări peste anumite lucruri. Chemați asistentul ori de câte ori vi se pare că nu înțelegeți ceva.

Pentru mai multe detalii despre utilizarea vim puteți consulta Vim Cheatsheet. În general când lucrați cu Vim, dacă vă loviți de probleme, apăsați ESC pentru a ajunge în modul normal. Și rețineți că puteți folosi, în modul normal, comanda :q! pentru a părăsi editorul fără a salva vreo modificare.

2. Crearea arhivelor zip/tar (1 karma WoUSO)

[1a] Intrați în directorul uso-repository/lab02/anul_1/programare/teme/tema1. Folosind interfața grafică, creați o arhivă .zip care conține toate fișierele cu extensia .c, în rădăcina arhivei.

[1b] Intrați în directorul uso-repository/lab02/anul_1/programare/teme/tema2. Folosind linia de comandă, creați o arhivă .zip care conține toate fișierele cu extensia .c, .h, .md, Makefile, în rădăcina arhivei. Folosiți comanda zip. Consultați această pagină pentru exemple de utilizare.

[1c] Intrați în directorul uso-repository/lab02/anul_1/programare/teme. Folosind linia de comandă, creați o arhivă .tar.gz care conține în rădăcina arhivei directorul tema3. Pentru aceasta nu mai putem folosi comanda zip, ci putem, de exemplu, utiliza comanda tar. Spre deosebire de zip, tar poate lucra cu mai multe tipuri de compresie, prin urmare va trebui să-i specificați printr-un parametru că doriți o arhivă de tipul gzip. Căutați după stringul gzip în pagina de manual a comenzii tar.

student@uso:~$ man tar

De asemenea, pentru a specifica faptul că dorim crearea unei arhive precum și numele acesteia, sunt necesari alți dori parametri pentru comanda tar. Căutați în pagina de manual după strigurile create, respectiv filename. Consultați această pagină pentru mai multe exemple de utilizare a comenzii tar.

3. Wildcards (1 karma WoUSO)

Am văzut în secțiunea de Demo că putem folosi anumite caractere ce țin locul unor bucăți de text, de exemplu caracterul *. De exemplu, dacă dorim să listăm toate fișierele din /etc care încep cu stringul ssh putem folosi comanda:

student@uso:~$ ls /etc/ssh*

După cum observați, caracterul * ține loc pentru "oricâte și orice caractere". Procedați asemănător și afișați fișierele sau directoarele din /etc cu extensia .conf.

Realizați o arhivă de tipul zip în directorul home al utilizatorului student (/home/student) care să conțină toate fișierele și directoarele din /etc/ care conțin stringul conf în numele lor.

Este foarte probabil ca printre fișierele și directoarele găsite să existe directoare care nu sunt goale. Pentru a arhiva și conținutul acestora trebuie să specificăm acest lucru explicit comenzii zip. Căutați în pagina de manual după stringul recursive.

4. Căutarea în sistemul de fișiere (1 karma WoUSO)

De multe ori se întâmplă să vrem să accesăm un anumit fișier sau director, dar nu cunoaștem calea exactă către el sau pur și simplu nu mai cunoaștem nici numele exact al fișierului ci numai o mică parte. Pentru a realiza o căutare foarte rapidă în tot sistemul de fișiere putem folosi comanda locate.

stdudent@uso:~$ locate vmlinuz

Creați acum un fișier în directorul /home/student/uso-repository cu numele uso-file. Căutați fișierul folosind comanda locate. Observăm că de această dată comanda locate nu mai găsește niciun fișier, chiar dacă suntem siguri că el există. Acest lucru se datorează faptului că locate realizează o căutare indexată pe baza unei baze de date proprii. Din cauza faptului că baza de date nu a fost actualizată recent, fișierul creat de noi nu este indexat. Căutați în pagina de manual a comenzii locate cum putem aduce la zi baza de date. Căutați din nou fișierul uso-file.

De notat faptul că locate acceptă și wildcards, prin urmare putem căuta, de exemplu, fișiere cărora nu le cunoaștem numele complet.

student@uso:~$ locate *linuz

5. Istoria directoarelor prin care am navigat (2 karma WoUSO)

  • Reamintiți-vă ce face comanda cd -.
  • Identificați o problemă a ei.
  • Ce se întâmplă dacă o folosim de două ori consecutiv?
  • Explicați funcționarea comenzilor pushd și popd.
  • Cum putem afișa stiva de directoare, fără a o modifica? Indicație: dirs.
  • pushd, popd și dirs sunt comenzi built-in ale shell-ului (Bash). Drept urmare, nu au propria pagină de manual. Căutați informații despre ele în man bash.
  • Navigați prin folderul uso-repository/lab02 folosind pushd și popd (afișați din când în când stiva de directoare)

Sumar. Cuvinte cheie

  • Version Control: Git, git.
  • Navigare prin directoare: cd. Listarea conținutului: ls. Sistemul de fișiere în Linux are o structură arborescentă: ls -R, tree
  • Redenumire fișiere, mutare fișiere: mv
  • Copiere fișiere: cp
  • Linux manpages and offline help: man, apropos, which, whereis
  • Wildcard listing use-case: Listarea tuturor fișierelor cu extensia .conf din directorul etc din rădăcină:
     ls /etc/*.conf 
  • Informații despre spațiul ocupat pe disk: ls -l vs. du
  • Copiere/ștergere recursivă a directoarelor care nu sunt goale: rm -r my_dir, cp -R my_dir
  • rmdir vs. rm vs. rm -rf
  • Afișarea conținutului unor fișiere: cat file. Semnificația cat este de concatenare a fișierelr primite ca argument de intrare și de afișare la ieșirea standard a conținutului: cat file1 file2 file3 … . Dacă nici un fișier nu e dat ca argument de intrare, atunci cat va aștepta date de la intrarea standard (tastatură) până când este apăsata combinația de taste CTRL+d.
  • Istoricul comenzilor executate: history, sau mai eficient: reverse search, folosind combinația de taste CTRL+r
  • Căutarea în sistemul de fișiere: locate
  • Editarea de fișiere text: vim. Tutorial pentru vim: comanda vimtutor.
  • Arhivare/dezarhivare: tar, zip
uso-ac/laboratoare/laborator-02.txt · Last modified: 2017/10/02 11:51 by giorgiana.vlasceanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0