Inspectarea sistemului de fișiere

Cea mai importantă comandă

Așa cum spuneam mai devreme, marele avantaj al utilizării terminalului este că ne ajută să rezolvăm sarcini foarte rapid. Rezolvăm sarcini folosind utilitarele pe care le avem disponibile în linia de comandă, fie că acestea fac parte din sistemul nostru sau le-am instalat.

Cel mai important utilitar pe care îl avem la dispoziție este man. Utilitarul man ne deschide pagina de manual în care este documentat un alt utilitar pe care dorim să-l folosim.

student@uso:~$ man
What manual page do you want?

Putem consulta însăși pagina de manual a utilitarului man

student@uso:~$ man man

Vom fi întâmpinați de următorul program interactiv:

MAN(1)                        Manual pager utils                        MAN(1)
 
NAME
       man - an interface to the on-line reference manuals
 
SYNOPSIS
       man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R encoding] [-L
       locale] [-m system[,...]] [-M path] [-S list]  [-e  extension]  [-i|-I]
       [--regex|--wildcard]   [--names-only]  [-a]  [-u]  [--no-subpages]  [-P
       pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justifi‐
       cation]  [-p  string]  [-t]  [-T[device]]  [-H[browser]] [-X[dpi]] [-Z]
       [[section] page[.section] ...] ...
       man -k [apropos options] regexp ...
       man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
       man -f [whatis options] page ...
       man -l [-C file] [-d] [-D] [--warnings[=warnings]]  [-R  encoding]  [-L
       locale]  [-P  pager]  [-r  prompt]  [-7] [-E encoding] [-p string] [-t]
       [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...
       man -w|-W [-C file] [-d] [-D] page ...
       man -c [-C file] [-d] [-D] page ...
       man [-?V]
 
 Manual page man(1) line 1 (press h for help or q to quit)

Observăm că ultima linie din terminal, Manual page man(1) line 1 (press h for help or q to quit), ne oferă mai multe informații:

  • Ne aflăm pe prima linie din prima pagină a manualului
  • Putem apăsa tasta h pentru a acesa meniul de ajutor
  • Putem apăsa tasta q pentru a ieși din manual

Navigăm cu câte o linie de terminal în joș și în sus folosind folosind tastele Ctrl+n și Ctrl+p. Putem folosi tastele Ctrl+f și Ctrl+b pentru a naviga, cu câte un ecran de terminal, în jos și în sus în pagină. Mai simplu, putem folosi tasta Enter pentru a naviga cu câte o linie în jos și tasta Space pentru a naviga cu câte un ecran în jos. Navigăm la începutul paginii folosind tasta g. Navigăm la sfârșit paginii folosind tasta G.

Putem folosi tastele j și k ca alternative pentru Arrow Down și Arrow Up. Astfel suntem mai rapizi pentru că nu ne mai mutăm mâna de pe tastele caractere.

Folosim man ca să vedem dacă un utilitar oferă o anumită funcționaltiate. Citim întreaga pagină de manual ca să vedem toate funcționalitățile sau căutăm o funcționalitate folosind cuvinte cheie. Pașii pentru căutarea unui cuvânt cheie sunt următorii:

  1. Pentru a porni funcția de căutare apăsăm tasta / în sesiunea interactivă din man.
  2. În continuare vom introduce textul pe care dorim să-l căutăm: poate să fie un cuvântul cheie pe care îl știm deja sau orice text care sperăm că ne duce la rezultatul dorit.
  3. Acum apăsăm tasta Enter. Vom fi duși la primul rezultat care se potrivește căutării, dacă acesta există.
  4. Dacă vrem să navigăm la următorul rezultat apăsăm tasta n. Dacă vrem să navigăm la un rezultat anterior apăsăm tasta N.

Căutarea1) are loc de la poziția curentă în pagină către sfârșitul paginii. Dacă am navigat deja în interiorul paginii, trebuie să avem în vedere că rezultatul de interes al căutării noastre se poate alfa undeva între începutul paginii și poziția noastră curentă2).

Selectarea multiplor fișiere folosind globbing

Înainte de a trece mai departe, mergeți în directorul ~/uso-lab/labs/05-cli/support/support-globbing.

Întotdeauna când deschidem un terminal o facem pentru că vrem să realizăm o sarcină: de exemplu, vrem să redenumim rapid ultimele poze făcute cu telefonul de la genericul DCIM1001 la ceva util Excursie Sinaia, Ian 2020, 1001, vrem să ne testăm proiectul și să urcăm modificările pe GitHub, etc.

Până acum am aplicat diferite comenzi fie pe fișiere individuale, fie pe întreg directorul. Foarte des vom avea nevoie de un mijloc prin care să putem selecta un număr variabil de fișiere care au un nume care corespunde unui tipar (pattern) comun.

Să revenim la scenariul prezentat anterior: vrem să selectăm pozele din excursia din Sinaia. În directorul în care avem pozele din excursie avem și alte poze de la alte evenimente. Știm că pozele din excursie încep toate cu numele DCIM și apoi sunt urmate de un număr. Ceea ce vrem să facem este să selectăm toate pozele al căror nume corespunde acestui tipar și să le mutăm într-un director separat. Pentru a face acest lucru, folosim globbing, ca în exemplul de mai jos:

student@uso:~/.../05-cli/support/support-globbing$ mv DCIM* excursie-Sinaia-2020/

Observăm argumentul pe care l-am dat comenzii mv, și anume DCIM*. Expresia DCIM* este un exemplu de globbing: adică o expresie care descrie un tipar prin folosirea unor caractere speciale, așa cum este caracterul *. În cazul de față, expresia DCIM* înseamnă orice fișier al cărui nume începe cu șirul de caractere DCIM.

Caracterul special *

În sintaxa globbing, caracterul * poate fi înlocuit cu orice caracter de oricâte ori, sau poate lipsi cu totul. În directorul nostru home (~), executăm următoarele comenzi:

student@uso:~$ ls
Desktop    Downloads  Pictures  Templates  examples.desktop  vm-actions-log.txt
Documents  Music      Public    Videos     uso.git           workspace
 
student@uso:~$ ls -d D*
Desktop  Documents  Downloads
 
student@uso:~$ ls -d Music*
Music

Observăm că în expresia D*, caracterul * înglobează toate caracterele care urmează literei D: “esktop”, “ocuments” și “ownloads”. Observăm că în cazul expresie Music*, * nu ține locul nici unui caracter.

Sintaxa specială []

În sintaxa globbing, folosim sintaxa [] pentru a defini o listă de caractere care pot fi folosite în înlocuire. Această sintaxă înlocuiește exact un caracter din lista oferită. În directorul nostru home (~), executăm următoarele comenzi:

student@uso:~$ ls -d Mus[ijk]c
Music
 
student@uso:~$ ls -d Mus[abc]c
ls: cannot access 'Mus[abc]c': No such file or directory

În expresia Musi[ijk]c, i-am “spus” shell-ului că al patrulea caracter poate să fie oricare din lista [ijk]. În acest context, folosind globbing s-a găsit cu succes numele fișierului Music. În expresia Mus[abc]c, i-am “spus” shell-ului că al patrulea caracter poate să fie oricare din lista [abc]. Deoarece nu avem niciun fișier numit Musac, Musbc sau Muscc, comanda ne-a afișat mesajul de eroare corespunzător.

Sintaxa [] nu ne limitează la a oferi enumarații de caractere, așa cum am făcut cu [ijk] sau [abc]. Sintaxa accepta și intervale, cum observăm în exemplul de mai jos:

student@uso:~$ ls -d Mus[A-Za-z0-9]c
Music

Citim expresia [A-Za-z0-9] în următorul mod: această expresie înlocuiește un caracter din intervalul A-Z sau din intervalul a-z sau din intervalul 0-9; cu alte cuvinte înlocuiește un caracter alfa-numeric3).

Tip

Folosind sintaxa [] putem rescrie mutarea pozelor a.î. să o facem mai precisă:

student@uso:~/.../05-cli/support/support-globbing$ mv DCIM[0-9][0-9][0-9][0-9].jpg excursie-Sinaia-2020/

Cu expresia de mai sus vom muta toate pozele din intervalul DCIM0000 - DCIM9999.

Sintaxa specială {}

În sintaxa globbing, folosim sintaxa {} pentru a defini o listă de cuvinte (grupuri de caractere) care pot fi folosite în înlocuire. Această sintaxă înlocuiește exact un cuvânt din lista oferită. În directorul vostru home (~), executați următoarele comenzi:

student@uso:~$ ls -d {Downloads,Music}
Downloads  Music
 
student@uso:~$ ls -d {Down,Mus}*
Downloads  Music

Citim expresia {Downloads,Music}: în locul acestei expresii poate să existe cuvântul Downloads sau cuvântul Music. Observăm că putem să combinăm orice elemente de globbing, așa cum am făcut în expresia {Down,Mus}*.

Folosirea ad-litteram a caracterelor speciale

Există cazuri când numele fișierelor conțin caractere speciale. Unele fișiere pot fi prefixate cu o categorie din care fac parte, ca în exemplul de mai jos:

student@uso:~$ ls Documents/uni
'[PC] Course 01.pdf'  '[USO] Course 01.pdf'  '[USO] Course 02.pdf'

În exemplul de mai sus, fișierele pdf de curs sunt prefixate cu numele materiei: [PC], [USO]. Vrem să îi spunem sintaxei de globbing că în acest caz, șirul [USO] nu trebuie tratat ca o expresie, ci ca un șir de caracter normale. Pentru a face acest lucru, încadrăm șirul între :

student@uso:~$ ls Documents/uni/"[USO]"*
'Documents/uni/[USO] Course 01.pdf'  'Documents/uni/[USO] Course 02.pdf'

Citim expresia "[USO]"*: orice fișier al cărui nume începe cu șirul de caractere [USO] și este urmat de orice caracter. Operația prin care eliminăm semnificația specială a unui caracter poartă numele de escaping; cu alte cuvinte, informal, spunem că am făcut escaping semnificației speciale a sintaxei []. Termenul vine de la cuvântul escape (a scăpa), și exprimă că scăpăm de semnificația specială a unui caracter / set de caractere.

Exerciții

Pentru exercițiile următoare vom folosi fișierele din directorul de suport ~/uso-lab/labs/05-cli/support/support-globbing.

  1. Creați un director numit pdfs. Mutați toate fișierele cu extensia .pdf din directorul ~/uso-lab/labs/05-cli/support/support-globbing în directorul pdfs.
  2. Creați un director numit Excursie Brasov, 2020-2021. Mutați fișierele DCIM din intervalul 1400 - 1700 în directorul creat.
  3. Creați un director numit cursuri/anul-I. Mutați toate fișierele care conțin cuvintele curs sau slide în directorul creat. Folosiți sintaxa *{curs,slide}*.

Căutarea unui fișier în sistem

De multe ori ne aflăm în situația în care căutăm un fișier pe disc: ex. doar ce am clonat un proiect de pe GitHub și vrem să inspectăm fișierul Makefile pentru a vedea cum compilăm și rulăm proiectul. Un alt exemplu poate fi că vrem să vedem cum arată fișierele de test existente în proiect. De multe ori, ințelegem mai bine proiectul doar prin simpla inspectare a testelor.

Există două utilitare care ne permit să căutăm în cadrul sistemului de fișiere: locate și find. Ele au fost prezentate și în laboratorul 03: Lucrul cu fișiere (2). În continuare vedem câteva exemple de folosire ale utilitarului find.

Utilitarul find

Utilitarul find îndeplinește același scop: căuta în fișierele de pe sistem. find este un utilitar mai complex decât locate. Acesta ne permite să căutăm fișiere după nume, permisiuni, tipul fișierelor, data ultimei modificări și multe altele. Inspectăm pagina de manual a utilitarului pentru a vedea cum îl putem folosi.

student@uso:~$ man find
 
SYNOPSIS
       find  [-H]  [-L]  [-P]  [-D  debugopts]  [-Olevel]  [starting-point...]
       [expression]

La o primă vedere, find poate părea complex și intimidant, dar lucrurile stau foarte simplu. Folosim find cu sintaxa find [starting-point] [expression], ca în exemplul de mai jos:

student@uso:~$ find . -name "*search*"
./C/searching
./C/searching/linear_search.c
./C/searching/other_binary_search.c
./C/searching/binary_search.c
./C/searching/modified_binary_search.c
./C/searching/jump_search.c
./C/searching/interpolation_search.c
./C/searching/fibonacci_search.c
./C/searching/ternary_search.c
./C/searching/pattern_searc h
./C/searching/pattern_search/naive_search.c
./C/searching/pattern_search/boyer_moore_search.c
./C/searching/pattern_search/rabin_karp_search.c
./C/data_structures/binary_trees/binary_search_tree.c

În exemplul de mai sus observă că am folosit ca starting-point . (căutarea pleacă din directorul curent), iar ca expression -name "*search*".

Utilitarul find folosește o expresie compusă pentru căutare. În exemplul anterior am folosit opțiunea -name PATTERN. Exact ca în cazul utilitarului locate, PATTERN poate folosi sintaxa globbing, așa cum am făcut în exemplul de mai sus "*search*".

Atunci când folosim sintaxa globbing, trebuie să fim atenți să încadrăm PATTERN între " (ghilimele), așa cum am făcut în exemplul de mai sus. Trebuie să facem asta pentru ca sintaxa globbing să fie interpretată de către utilitarul find și nu de către terminalul (bash) din care lansăm utilitarul.

Exerciții

  1. Folosind find căutați fișierele care conțin șirul tmp în nume. Hint: [starting point] este /.
  2. Folosind find căutați fișierele care conțin șirul bin în nume. Hint: [starting point] este /.

Note de subsol

1) Căutarea este case-sensitive. Putem să schimbăm acest comportament prin introducerea opțiunii -I în sesiunea interactivă, înainte de a porni căutarea. Dacă doriți să aflați mai multe despre opțiunile pe care le putem introduce apăsați tasta h într-o sesiune interactivă și căutați textul “OPTIONS”.
2) Putem folosi tasta ? pentru a porni o căutare de la poziția curentă către începutul paginii. Alternativ, putem naviga la începutul paginii prin apăsarea unei singure taste (g) și apoi pornim căutarea / de acolo.
3) Folosim forma A-Za-z pentru a preciza orice caracter din alfabetul englez, indiferent dacă este majusculă sau nu. Nu putem folosi forma A-z datorită reprezentării caracterelor în tabelul ASCII. Caracterele A-Z sunt reprezentate în intervalul 65-90, iar caracterele a-z în intervalul 97-122 în tabelul ascii. Dacă am folosi forma A-z, i-am indica expresiei globbing să includă și caracterele din intervalul 91-96 din tabelul ascii în expresia noastră.
uso/laboratoare/laborator-07/inspect-fs.txt · Last modified: 2021/11/22 16:46 by andreia.ocanoaia
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