This shows you the differences between two versions of the page.
uso:laboratoare:laborator-06:inspect-fs [2022/11/07 17:53] andrei.dragomir1401 [Selectarea multiplor fișiere folosind globbing] |
uso:laboratoare:laborator-06:inspect-fs [2023/11/07 19:05] (current) maria_irina.gherman [Căutarea unui fișier în sistem] |
||
---|---|---|---|
Line 99: | Line 99: | ||
Manual page ls(1) line 1 (press h for help or q to quit) | Manual page ls(1) line 1 (press h for help or q to quit) | ||
</code> | </code> | ||
- | <HTML><ol></HTML> | + | |
- | <HTML><li></HTML>Prima secțiune care ne interesează este "DESCRIPTION". Citim descrierea și ne dăm seama dacă utilitarul ne va ajuta în rezolvarea sarcinii pe care o avem. În cazul utilitarului ''%%ls%%'', descrierea ne informează că acesta afișează informații despre fișierele din calea indicată, sau din directorul curent atunci când nu specificăm o cale.<HTML></li></HTML> | + | * Prima secțiune care ne interesează este "DESCRIPTION". Citim descrierea și ne dăm seama dacă utilitarul ne va ajuta în rezolvarea sarcinii pe care o avem. În cazul utilitarului ''%%ls%%'', descrierea ne informează că acesta afișează informații despre fișierele din calea indicată, sau din directorul curent atunci când nu specificăm o cale. |
- | <HTML><li></HTML><HTML><p></HTML>Cea de-a doua secțiune care ne interesează este "SYNOPSIS". Aceasta ne spune cum putem să rulăm utilitarul, ce opțiuni și argumente sunt opționale (pot lipsi) și ce opțiuni și argumente sunt obligatorii.<HTML></p></HTML> | + | * Cea de-a doua secțiune care ne interesează este "SYNOPSIS". Aceasta ne spune cum putem să rulăm utilitarul, ce opțiuni și argumente sunt opționale (pot lipsi) și ce opțiuni și argumente sunt obligatorii. |
<code bash> | <code bash> | ||
SYNOPSIS | SYNOPSIS | ||
Line 127: | Line 127: | ||
- Căutați cuvântul cheie ''%%list%%''. Treceți la următoarea apariție a cuvântului cheie până ajungeți la opțiunea ''%%-l%%''. | - Căutați cuvântul cheie ''%%list%%''. Treceți la următoarea apariție a cuvântului cheie până ajungeți la opțiunea ''%%-l%%''. | ||
- Mergeți la finalul paginii folosind tasta ''%%G%%''. Căutați cuvântul cheie ''%%color%%'' până ajungeți la opțiunea ''%%--color%%'' (Hint: ''%%?%%''). | - Mergeți la finalul paginii folosind tasta ''%%G%%''. Căutați cuvântul cheie ''%%color%%'' până ajungeți la opțiunea ''%%--color%%'' (Hint: ''%%?%%''). | ||
- | |||
- | ==== Bonus: Utilizarea pachetului tldr ==== | ||
- | Necesita instalare pe unele masini virtuale. | ||
- | <code bash> | ||
- | student@uso:~$ sudo apt install tldr | ||
- | student@uso:~$ tldr -u | ||
- | </code> | ||
- | |||
- | Utilitarul ''%%tldr%%'' (too long, didn't read) oferă o versiune simplificată a paginilor de manual. Acesta ne va arăta un rezumat al utilizării unei comenzi cu opțiunile cele mai des folosite în comunitate. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ tldr ls | ||
- | ls | ||
- | List directory contents. | ||
- | |||
- | - List files one per line: | ||
- | ls -1 | ||
- | |||
- | - List all files, including hidden files: | ||
- | ls -a | ||
- | |||
- | - Long format list (permissions, ownership, size and modification date) of all files: | ||
- | ls -la | ||
- | |||
- | - Long format list with size displayed using human readable units (KB, MB, GB): | ||
- | ls -lh | ||
- | |||
- | - Long format list sorted by size (descending): | ||
- | ls -lS | ||
- | |||
- | - Long format list of all files, sorted by modification date (oldest first): | ||
- | ls -ltr | ||
- | </code> | ||
- | |||
- | |||
- | <note> | ||
- | Acesta trebuie tratat ca un cheatsheet accesibil din linie de comandă. ''%%tldr%%'' nu elimină utilizarea paginilor ''%%man%%'', dar ne ajută să găsim rapid opțiunile uzuale. Acestea fiind spuse, vă recomandăm ca întotdeaună să citiți și să înțelegeți din paginile ''%%man%%'' ce efect au opțiunile unei comenzi înainte de a le folosi. Feriți-vă să rulați comenzi orbește, pentru că așa ați găsit pe StackOverflow, tldr, etc. Întotdeauna asigurați-vă că ați înțeles cum și de ce rulați comanda și abia apoi treceți la fapte. | ||
- | </note> | ||
- | |||
- | === Exerciții: Utilizarea pachetului tldr === | ||
- | |||
- | Instalați pachetul ''%%tldr%%'' pe mașina voastră. | ||
- | |||
- | - Accesați pagina ''%%tldr%%'' a utilitarului ''%%ls%%''. | ||
- | - Accesați pagina ''%%tldr%%'' a utilitarului ''%%zip%%''. | ||
- | - Accesați pagina ''%%tldr%%'' a utilitarului ''%%tar%%''. | ||
===== Explorarea sistemului de fișiere: comanda ls ===== | ===== Explorarea sistemului de fișiere: comanda ls ===== | ||
- | În capitolul **Lucrul cu fișiere** am văzut cum folosim comanda ''%%ls%%'' pentru a afișa conținutul unui director și pentru a explora sistemul de fișiere. În continuare vom vedea cum folosim ''%%ls%%'' pentru a afișa mai multe informații despre conținutul unui director sau despre fișiere. | + | În laboratorul **Lucrul cu fișiere** am văzut cum folosim comanda ''%%ls%%'' pentru a afișa conținutul unui director și pentru a explora sistemul de fișiere. În continuare vom vedea cum folosim ''%%ls%%'' pentru a afișa mai multe informații despre conținutul unui director sau despre fișiere. |
==== Afișarea fișierelor ascunse ==== | ==== Afișarea fișierelor ascunse ==== | ||
Line 224: | Line 178: | ||
drwxr-xr-x 2 student student 4096 aug 6 2018 Desktop | drwxr-xr-x 2 student student 4096 aug 6 2018 Desktop | ||
</code> | </code> | ||
- | <HTML><ol></HTML> | ||
- | <HTML><li></HTML><HTML><p></HTML>Vom începe cu prima coloană din exemplul de mai sus: ''%%drwxr-xr-x%%''. Aceasta este formată din zece caractere care formează patru grupuri:<HTML></p></HTML> | ||
- | <HTML><ol></HTML> | ||
- | <HTML><li></HTML>Primul grup este format dintr-un singur caracter, și denotă tipul fișierului. În cazul de față, caracterul ''%%d%%'' ne informează că ne uităm la un fișier de tip director. În cazul fișierelor obișnuite (text, imagini, etc.) primul caracter este ''%%-%%'', așa cum putem observa în cazul fișierului ''%%examples.desktop%%''.<HTML></li></HTML> | ||
- | <HTML><li></HTML>Cel de-al doilea grup este format din următoarele trei caractere și denotă permisiunile pe care le are utilizatorul care deține fișierul asupra fișierului. Caracterele sunt în ordine ''%%r%%'' (read) permisiuni de citire, ''%%w%%'' (write) permisiuni de scriere și ''%%x%%'' (execute) permisiuni de rulare. Dacă utilizatorul nu are o anumită permisiune, caracterul corespunzător este înlocuit de caracterul ''%%-%%''. Spunem că aceste permisiuni se aplică pentru **User**. Mai multe despre permisiuni in laboratoarele viitoare deoarece sunt un topic foarte important.<HTML></li></HTML> | ||
- | <HTML><li></HTML>Cel de-al treilea grup este format din următoarele trei caractere și denotă permisiunile pe care le au membrii grupului care dețin fișierul asupra fișierului. Permisiunile rămân din setul ''%%rwx%%''. Spunem că aceste permisiuni se aplică pentru **Group**.<HTML></li></HTML> | ||
- | <HTML><li></HTML>Cel de-al patrulea grup este format din ultimele trei caractere și denotă permisiunile pe care le are orice utilizator care nu deține fișierul și nici nu face parte din grupul care deține fișierul. Permisiunile rămân din setul ''%%rwx%%''. Spunem că aceste permisiuni se aplică pentru **Others**.<HTML></li></HTML><HTML></ol></HTML> | ||
- | <HTML><p></HTML>Acum, pe baza informațiilor din prima coloană, putem spune următoarele despre fișierul Desktop:<HTML></p></HTML> | + | Vom începe cu prima coloană din exemplul de mai sus: ''%%drwxr-xr-x%%''. Aceasta este formată din zece caractere care formează patru grupuri: |
- | <HTML><ol></HTML> | + | |
- | <HTML><li></HTML>Acesta este un fișier de tip director (''%%d%%'')<HTML></li></HTML> | + | * Primul grup este format dintr-un singur caracter, și denotă tipul fișierului. În cazul de față, caracterul ''%%d%%'' ne informează că ne uităm la un fișier de tip director. În cazul fișierelor obișnuite (text, imagini, etc.) primul caracter este ''%%-%%'', așa cum putem observa în cazul fișierului ''%%examples.desktop%%''. |
- | <HTML><li></HTML>Utilizatorul care îl deține are drepturi de citire (''%%r%%''), scriere (''%%w%%'') și execuție (''%%x%%'')<HTML></li></HTML> | + | * Cel de-al doilea grup este format din următoarele trei caractere și denotă permisiunile pe care le are utilizatorul care deține fișierul asupra fișierului. Caracterele sunt în ordine ''%%r%%'' (read) permisiuni de citire, ''%%w%%'' (write) permisiuni de scriere și ''%%x%%'' (execute) permisiuni de rulare. Dacă utilizatorul nu are o anumită permisiune, caracterul corespunzător este înlocuit de caracterul ''%%-%%''. Spunem că aceste permisiuni se aplică pentru **User**. Mai multe despre permisiuni in laboratoarele viitoare, deoarece sunt un topic foarte important. |
- | <HTML><li></HTML>Grupul care îl deține are drepturi de citire (''%%r%%''), **NU** are drepturi de scriere (''%%-%%'') și are drepturi de execuție (''%%x%%'')<HTML></li></HTML> | + | * Cel de-al treilea grup este format din următoarele trei caractere și denotă permisiunile asupra fișierului pe care le au membrii grupului care dețin fișierul. Permisiunile rămân din setul ''%%rwx%%''. Spunem că aceste permisiuni se aplică pentru **Group**. |
- | <HTML><li></HTML>Iar orice alt utilizator are drepturi de citire (''%%r%%''), **NU** are drepturi de scriere (''%%-%%'') și are drepturi de execuție (''%%x%%'').<HTML></li></HTML><HTML></ol></HTML> | + | * Cel de-al patrulea grup este format din ultimele trei caractere și denotă permisiunile pe care le are orice utilizator care nu deține fișierul și nici nu face parte din grupul care deține fișierul. Permisiunile rămân din setul ''%%rwx%%''. Spunem că aceste permisiuni se aplică pentru **Others**. |
+ | |||
+ | Acum, pe baza informațiilor din prima coloană, putem spune următoarele despre fișierul Desktop: | ||
+ | - Acesta este un fișier de tip director (''%%d%%'') | ||
+ | - Utilizatorul care îl deține are drepturi de citire (''%%r%%''), scriere (''%%w%%'') și execuție (''%%x%%'') | ||
+ | - Grupul care îl deține are drepturi de citire (''%%r%%''), **NU** are drepturi de scriere (''%%-%%'') și are drepturi de execuție (''%%x%%'') | ||
+ | - Iar orice alt utilizator are drepturi de citire (''%%r%%''), **NU** are drepturi de scriere (''%%-%%'') și are drepturi de execuție (''%%x%%''). | ||
<note> | <note> | ||
- | Pentru a putea deschide un director este necesar să avem drepturi de execuție (''%%x%%'') asupra acestuia. Trebuie să avem drepturi de execuție indiferent că vrem să navigăm în interiorul său, să afișăm conținutul directorului sau să creăm noi fișiere și directoare în cadrul acestuia. | + | Pentru a putea deschide un director este necesar să avem drepturi de execuție (''%%x%%'') asupra acestuia. Trebuie să avem drepturi de execuție indiferent că vrem să navigăm în interiorul său sau să afișăm conținutul directorului. Pentru a crea noi fișiere și directoare în cadrul acestuia, avem nevoie de drepturi de scriere (''%%w%%''). |
</note> | </note> | ||
- | <HTML></li></HTML> | + | |
<HTML><li></HTML>Cea de-a treia coloană ne spune care este utilizatorul care deține fișierul. Astfel observăm că directorul **Desktop** este deținut de către utilizatorul ''%%student%%''. Asta înseamnă că permisiunile ''%%rwx%%'' corespund utilizatorului ''%%student%%''.<HTML></li></HTML> | <HTML><li></HTML>Cea de-a treia coloană ne spune care este utilizatorul care deține fișierul. Astfel observăm că directorul **Desktop** este deținut de către utilizatorul ''%%student%%''. Asta înseamnă că permisiunile ''%%rwx%%'' corespund utilizatorului ''%%student%%''.<HTML></li></HTML> | ||
<HTML><li></HTML>Cea de-a patra coloană ne spune care este grupul care deține fișierul. Astfel observăm că directorul **Desktop** este deținut de către grupul ''%%student%%''. Asta înseamnă că permisiunile ''%%r-x%%'' se aplică oricărui utilizator care este membru al grupului ''%%student%%''.<HTML></li></HTML> | <HTML><li></HTML>Cea de-a patra coloană ne spune care este grupul care deține fișierul. Astfel observăm că directorul **Desktop** este deținut de către grupul ''%%student%%''. Asta înseamnă că permisiunile ''%%r-x%%'' se aplică oricărui utilizator care este membru al grupului ''%%student%%''.<HTML></li></HTML> | ||
Line 276: | Line 229: | ||
===== Selectarea multiplor fișiere folosind globbing ===== | ===== Selectarea multiplor fișiere folosind globbing ===== | ||
- | Întotdeauna când deschidem un terminal o facem pentru că vrem să realizăm o sarcină: 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: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/Pictures$ mv DCIM* excursie-Sinaia-2020/ | ||
- | </code> | ||
- | 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 * ==== | ==== Caracterul special * ==== | ||
Line 304: | Line 247: | ||
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. | 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. | ||
- | ==== Caracterul special ? ==== | ||
- | |||
- | În sintaxa globbing, caracterul ''%%?%%'' înlocuiește exact un caracter, oricare ar fi acela. În directorul nostru home (''%%~%%''), executăm următoarele comenzi: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ls -d Musi? | ||
- | Music | ||
- | |||
- | student@uso:~$ ls -d Mus?? | ||
- | Music | ||
- | |||
- | student@uso:~$ ls -d Music? | ||
- | ls: cannot access 'Music?': No such file or directory | ||
- | </code> | ||
- | Observăm că expresiile ''%%Musi?%%'' și ''%%Mus??%%'' s-au înlocuit cu succes cu numele directorului ''%%Music%%'', dar expresia ''%%Music?%%'' a generat o eroare deoarece nu există nici un fișier **Music** urmat de un caracter. | ||
- | |||
- | ==== Extra: 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: | ||
- | |||
- | <code bash> | ||
- | 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 | ||
- | </code> | ||
- | În expresia ''%%Musi[ijk]c%%'', i-am "spus" shellului că al patrulea caracter poate să fie oricare din lista ''%%[ijk]%%''. În acest context, globbing a găsit cu succes numele fișierului **Music**. În expresia ''%%Musi[abc]c%%'', i-am "spus" shellului 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: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ls -d Mus[A-Za-z0-9]c | ||
- | Music | ||
- | </code> | ||
- | 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-numeric//((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ă. | ||
- | )). | ||
- | |||
- | <note> | ||
- | Tip | ||
- | Folosind sintaxa ''%%[]%%'' putem rescrie mutarea pozelor a.î. să o facem mai precisă: | ||
- | </note> | ||
- | <code bash> | ||
- | student@uso:~/Pictures$ mv DCIM[0-9][0-9][0-9][0-9] excursie-Sinaia-2020/ | ||
- | </code> | ||
- | Cu expresia de mai sus vom muta toate pozele din intervalul **DCIM0000** - **DCIM9999**. | ||
- | |||
- | |||
- | ==== Extra: 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: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ls -d {Downloads,Music} | ||
- | Downloads Music | ||
- | |||
- | student@uso:~$ ls -d {Down,Mus}* | ||
- | Downloads Music | ||
- | </code> | ||
- | 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}*%%''. | ||
==== Extra: Folosirea ad-litteram a caracterelor speciale ==== | ==== Extra: Folosirea ad-litteram a caracterelor speciale ==== | ||
Line 370: | Line 253: | ||
<code bash> | <code bash> | ||
- | student@uso:~$ ls Documents/uni | + | student@uso:~/uso-lab/labs/05-cli/support$ ls tutorial/uni/ |
- | '[PC] Course 01.pdf' '[USO] Course 01.pdf' '[USO] Course 02.pdf' | + | '[USO] Course 01.pdf' '[USO] Course 02.pdf' |
</code> | </code> | ||
- | Î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 **"**: | + | În exemplul de mai sus, fișierele pdf de curs sunt prefixate cu numele materiei: [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 **"**: |
<code bash> | <code bash> | ||
- | student@uso:~$ ls Documents/uni/"[USO]"* | + | student@uso:~/uso-lab/labs/05-cli/support$ ls support-globbing/"[USO]"* |
- | 'Documents/uni/[USO] Course 01.pdf' 'Documents/uni/[USO] Course 02.pdf' | + | 'support-globbing/[USO] cursuri 1.ppt' 'support-globbing/[USO] slides 1.ppt' |
+ | 'support-globbing/[USO] cursuri 10.ppt' 'support-globbing/[USO] slides 10.ppt' | ||
+ | 'support-globbing/[USO] cursuri 2.ppt' 'support-globbing/[USO] slides 2.ppt' | ||
+ | 'support-globbing/[USO] cursuri 3.ppt' 'support-globbing/[USO] slides 3.ppt' | ||
+ | 'support-globbing/[USO] cursuri 4.ppt' 'support-globbing/[USO] slides 4.ppt' | ||
+ | 'support-globbing/[USO] cursuri 5.ppt' 'support-globbing/[USO] slides 5.ppt' | ||
+ | 'support-globbing/[USO] cursuri 6.ppt' 'support-globbing/[USO] slides 6.ppt' | ||
+ | 'support-globbing/[USO] cursuri 7.ppt' 'support-globbing/[USO] slides 7.ppt' | ||
+ | 'support-globbing/[USO] cursuri 8.ppt' 'support-globbing/[USO] slides 8.ppt' | ||
+ | 'support-globbing/[USO] cursuri 9.ppt' 'support-globbing/[USO] slides 9.ppt' | ||
</code> | </code> | ||
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. | 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. | ||
Line 383: | Line 275: | ||
==== Exerciții ==== | ==== Exerciții ==== | ||
- | Pentru exercițiile următoare vom folosi fișierele din directorul de suport ''%%support-globbing%%''. | + | Pentru exercițiile următoare vom folosi fișierele din directorul de suport ''%%~/uso-lab/labs/05-cli/support/support-globbing%%''. |
- | - Creați un director numit ''%%pdfs%%''. Mutați toate fișierele cu extensia ''%%.pdf%%'' din directorul ''%%support-globbing%%'' în directorul ''%%pdfs%%''. | + | - Creați un director numit ''%%pdfs%%''. Mutați toate fișierele cu extensia ''%%.pdf%%'' din directorul curent în directorul ''%%pdfs%%''. |
+ | - Creați un director numit ''%%cursuri/anul-I%%''. De ce nu funcționează crearea directorului? Există directorul ''%%cursuri%%''? Mutați toate fișierele care conțin cuvintele **curs** sau **slide** în directorul creat. Extra: Folosiți sintaxa ''%%*{curs,slide}*%%''. | ||
- Creați un director numit ''%%Excursie Brasov, 2020-2021%%''. Mutați fișierele **DCIM** din intervalul 1400 - 1700 în directorul creat. | - Creați un director numit ''%%Excursie Brasov, 2020-2021%%''. Mutați fișierele **DCIM** din intervalul 1400 - 1700 în directorul creat. | ||
- | - Creați un director numit ''%%cursuri/anul-I%%''. Mutați toate fișierele care conțin cuvintele **curs** sau **slide** în directorul creat. Extra: Folosiți sintaxa ''%%*{curs,slide}*%%''. | ||
===== Căutarea unui fișier în sistem ===== | ===== Căutarea unui fișier în sistem ===== | ||
Line 395: | Line 287: | ||
Există două utilitare care ne permit să căutăm în cadrul sistemului de fișiere: ''%%locate%%'' și ''%%find%%''. | Există două utilitare care ne permit să căutăm în cadrul sistemului de fișiere: ''%%locate%%'' și ''%%find%%''. | ||
- | ==== Utilitarul locate ==== | ||
- | Utilitarul ''%%locate%%'' folosește o bază de date pentru a căuta în fișierele de pe sistem. Inspectăm pagina de manual a utilitarului pentru a vedea cum îl putem folosi, folosind comanda ''%%man%%'': | + | ==== Utilitarul find ==== |
+ | |||
+ | Utilitarul ''%%find%%'' îndeplinește scopul evident de a 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. | ||
<code bash> | <code bash> | ||
- | student@uso:~$ man locate | + | student@uso:~$ man find |
SYNOPSIS | SYNOPSIS | ||
- | locate [OPTION]... PATTERN... | + | find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] |
+ | [expression] | ||
</code> | </code> | ||
- | Observăm că ''%%locate%%'' primește ca argument un șir de caractere, **PATTERN**, care fac parte din numele fișierului pe care în căutăm, dar nu trebuie să-i dăm numele exact: | + | Să clonăm un repository cu algoritmi de sortare: |
- | + | ||
- | <code bash> | + | |
- | student@uso:~$ locate todos.txt | + | |
- | /home/student/Desktop/todos.txt | + | |
- | student@uso:~$ locate todos | + | |
- | /home/student/Desktop/todos.txt | + | |
- | </code> | + | |
- | Putem să folosim și sintaxa globbing pentru a descrie numele fișierului căutat: | + | |
- | + | ||
- | <code bash> | + | |
- | student@uso:~$ locate "*.txt" | + | |
- | /home/student/vm-actions-log.txt | + | |
- | /home/student/.local/lib/python2.7/site-packages/Keras_Applications-1.0.8.dist-info/top_level.txt | + | |
- | /home/student/.local/lib/python2.7/site-packages/Keras_Preprocessing-1.1.2.dist-info/top_level.txt | + | |
- | /home/student/.local/lib/python2.7/site-packages/Markdown-3.1.1.dist-info/entry_points.txt | + | |
- | /home/student/.local/lib/python2.7/site-packages/Markdown-3.1.1.dist-info/top_level.txt | + | |
- | /home/student/.local/lib/python2.7/site-packages/Werkzeug-1.0.1.dist-info/top_level.txt | + | |
- | </code> | + | |
- | Căutările cu ''%%locate%%'' sunt foarte rapide. Acest lucru se datorează utilizării bazei de date pentru a indexa fișierele din sistem. Într-o configurație implicită (//default//), baza de date se reconstruiește periodic, o dată la 24h. Asta înseamnă că ''%%locate%%'' nu va găsi fișiere care au fost create după reconstrucția bazei de date. Dacă vrem să reconstruim baza de date, folosim comanda ''%%updatedb%%''. | + | |
- | + | ||
- | Hai să clonăm repository-ul **TheAlgorithms/C**. Acesta conține implementările diferitor algoritmi folosind limbajul de programare C. | + | |
<code bash> | <code bash> | ||
+ | student@uso:~$ mkdir workspace | ||
student@uso:~$ cd workspace | student@uso:~$ cd workspace | ||
student@uso:~/workspace$ git clone https://github.com/TheAlgorithms/C.git | student@uso:~/workspace$ git clone https://github.com/TheAlgorithms/C.git | ||
student@uso:~/workspace$ cd C | student@uso:~/workspace$ cd C | ||
- | </code> | ||
- | Fiind vorba despre un repository care implementează algoritmi clasici, ne așteptăm să găsim și algoritmi de căutare, cum ar fi binary-search. Hai să căutăm după cuvântul cheie **search**. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/workspace$ locate search | grep workspace/C | ||
- | student@uso:~/workspace$ | ||
- | </code> | ||
- | Observăm că nu am găsit nici un rezultat. Cum spuneam mai devreme, trebuie să reconstruim baza de date pentru a căuta în fișierele nou create. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/workspace/C$ sudo updatedb | ||
- | [sudo] password for student: | ||
- | </code> | ||
- | Comanda ''%%updatedb%%'' trebuie executată în mod privilegiat, așa că folosim ''%%sudo%%''. Parola utilizatorului **student**, pe mașina noastră virtuală, este **student**. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/workspace/C$ locate search | grep workspace/C | ||
- | /home/student/workspace/C/searching | ||
- | /home/student/workspace/C/data_structures/binary_trees/binary_search_tree.c | ||
- | /home/student/workspace/C/searching/CMakeLists.txt | ||
- | /home/student/workspace/C/searching/binary_search.c | ||
- | /home/student/workspace/C/searching/fibonacci_search.c | ||
- | /home/student/workspace/C/searching/interpolation_search.c | ||
- | /home/student/workspace/C/searching/jump_search.c | ||
- | /home/student/workspace/C/searching/linear_search.c | ||
- | /home/student/workspace/C/searching/modified_binary_search.c | ||
- | /home/student/workspace/C/searching/other_binary_search.c | ||
- | /home/student/workspace/C/searching/pattern_search | ||
- | /home/student/workspace/C/searching/ternary_search.c | ||
- | /home/student/workspace/C/searching/pattern_search/CMakeLists.txt | ||
- | /home/student/workspace/C/searching/pattern_search/boyer_moore_search.c | ||
- | /home/student/workspace/C/searching/pattern_search/naive_search.c | ||
- | /home/student/workspace/C/searching/pattern_search/rabin_karp_search.c | ||
- | </code> | ||
- | === Exerciții === | ||
- | |||
- | - Folosind ''%%locate%%'' căutați fișierele care conțin șirul ''%%bubble_sort%%'' în nume. | ||
- | - Folosind ''%%locate%%'' căutați fișierele care conțin șirul ''%%quick_sort%%'' în nume. | ||
- | - Folosind ''%%locate%%'' căutați fișierele care conțin șirul ''%%merge_sort%%'' în nume. | ||
- | - Folosind ''%%locate%%'' căutați fișierele care conțin șirul ''%%sort%%'' în nume. | ||
- | |||
- | ==== 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. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ man find | ||
- | |||
- | SYNOPSIS | ||
- | find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] | ||
- | [expression] | ||
</code> | </code> | ||
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: | 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: | ||
<code bash> | <code bash> | ||
+ | student@uso:~/workspace/C$ cd ../.. | ||
student@uso:~$ find . -name "*search*" | student@uso:~$ find . -name "*search*" | ||
- | ./C/searching | + | ./workspace/C/searching |
- | ./C/searching/linear_search.c | + | ./workspace/C/searching/linear_search.c |
- | ./C/searching/other_binary_search.c | + | ./workspace/C/searching/other_binary_search.c |
- | ./C/searching/binary_search.c | + | ./workspace/C/searching/binary_search.c |
- | ./C/searching/modified_binary_search.c | + | ./workspace/C/searching/modified_binary_search.c |
- | ./C/searching/jump_search.c | + | ./workspace/C/searching/jump_search.c |
- | ./C/searching/interpolation_search.c | + | ./workspace/C/searching/interpolation_search.c |
- | ./C/searching/fibonacci_search.c | + | ./workspace/C/searching/fibonacci_search.c |
- | ./C/searching/ternary_search.c | + | ./workspace/C/searching/ternary_search.c |
- | ./C/searching/pattern_searc h | + | ./workspace/C/searching/pattern_searc h |
- | ./C/searching/pattern_search/naive_search.c | + | ./workspace/C/searching/pattern_search/naive_search.c |
- | ./C/searching/pattern_search/boyer_moore_search.c | + | ./workspace/C/searching/pattern_search/boyer_moore_search.c |
- | ./C/searching/pattern_search/rabin_karp_search.c | + | ./workspace/C/searching/pattern_search/rabin_karp_search.c |
- | ./C/data_structures/binary_trees/binary_search_tree.c | + | ./workspace/C/data_structures/binary_trees/binary_search_tree.c |
</code> | </code> | ||
- | În exemplul de mai sus observă că am folosit ca **starting-point** ''%%.%%'' (căutarea pleacă din directorul curent), iar ca **expression** ''%%-name "*search*"%%''. | + | În exemplul de mai sus observăm 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*"%%''. | + | |
- | + | ||
- | Note | + | |
+ | 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*"%%''. Există mai multe opțiuni pentru căutarea cu ''%%find%%'', prezente în manual. | ||
+ | <note> | ||
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. | 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. | ||
+ | </note> | ||
- | === Extra: Scenarii complexe de căutare === | ||
- | |||
- | Utilitarul ''%%find%%'' are o lungă listă de opțiuni pe care le putem folosi în expresii de căutare. Una din opțiunile mai cunoscute este ''%%-type%%'' care ne oferă posibilitatea de a căuta după tipul unui fișier: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ find workspace/C -type f | ||
- | workspace/C/leetcode/src/226.c | ||
- | workspace/C/leetcode/src/700.c | ||
- | workspace/C/leetcode/src/278.c | ||
- | [...] | ||
- | </code> | ||
- | În exemplul de mai sus i-am transmis utilitarului ''%%find%%'' că vrem să căutăm în directorul ''%%~/workspace/C%%'' toate fișierele text (regular file) ''%%-type f%%''. | ||
- | |||
- | **Exercițiu:** Accesați pagina de manual a utilitarului find (''%%man find%%'') și căutați opțiunea ''%%-type%%''. Căutați în directorul ''%%workspace/C%%'' după fiecare tip de fișier pentru care oferă suport opțiunea ''%%-type%%''. | ||
- | |||
- | Note | ||
- | |||
- | |||
- | Reminder: pentru a căuta în man folosim ''%%/%%'' pentru a intra în search mode și apoi introducem textul pe care îl căutam ''%%-type%%'' urmat de tasta ''%%Enter%%''; pentru a ne duce la următorul rezultat al căutării folosim tasta ''%%n%%'' (next). | ||
- | |||
- | |||
- | În cadrul unei căutări putem să combinăm opțiunile de căutare: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ find workspace/C -type f -name "*search*" | ||
- | workspace/C/searching/modified_binary_search.c | ||
- | workspace/C/searching/ternary_search.c | ||
- | workspace/C/searching/jump_search.c | ||
- | workspace/C/searching/binary_search.c | ||
- | </code> | ||
- | În exemplul de mai sus căutăm toate fișierele text care conțin șirul **search** în nume. | ||
- | |||
- | Utilitarul ''%%find%%'' ne permite să executăm comenzi asupra rezultatelor căutării. Facem acest cu opțiunea ''%%-exec command {} ;%%''. Atunci când folosim ''%%-exec%%'', rezultatul căutării va înlocui șirul **'{}'** în textul comenzii; comanda de executat trebuie să se termine în caracterul ''%%;%%''. | ||
- | |||
- | Observăm exemplul de mai jos: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ find workspace/C -type f -name "*search*" -exec ls -l {} \; | ||
- | -rw-r--r-- 1 student student 3312 sep 17 19:20 workspace/C/searching/modified_binary_search.c | ||
- | -rw-r--r-- 1 student student 1782 sep 17 19:20 workspace/C/searching/ternary_search.c | ||
- | -rw-r--r-- 1 student student 1624 sep 17 19:20 workspace/C/searching/jump_search.c | ||
- | -rw-r--r-- 1 student student 2799 sep 17 19:20 workspace/C/searching/binary_search.c | ||
- | -rw-r--r-- 1 student student 867 sep 17 19:20 workspace/C/searching/other_binary_search.c | ||
- | </code> | ||
- | În exemplul de mai sus, argumetul opțiunii ''%%exec%%'' este ''%%ls -l {} \;%%''. În cuvinte, pentru fiecare fișier text care conține șirul **search** vom afișa informații în format lung (''%%ls -l {}%%''). Observăm că ''%%-exec%%'' se încheie cu ''%%\;%%'': este nevoie să escapăm caracterul ''%%;%%'' pentru ca acesta să fie interpretat de către utilitarul ''%%find%%'' și nu de către terminalul în care rulăm, exact ca în cazul ''%%-name PATTERN%%''. | ||
- | |||
- | În secțiunile ce urmează vom vedea cum ne folosim de opțiunea ''%%exec%%'' pentru a face recursiv search & replace în fișiere. | ||
- | |||
- | === Exerciții === | ||
- | |||
- | - Folosind ''%%find%%'' căutați fișierele care conțin șirul ''%%bubble_sort%%'' în nume. | ||
- | - Folosind ''%%find%%'' căutați fișierele care conțin șirul ''%%quick_sort%%'' în nume. | ||
- | - Folosind ''%%find%%'' căutați fișierele care conțin șirul ''%%merge_sort%%'' în nume. | ||
- | - Folosind ''%%find%%'' căutați fișierele care conțin șirul ''%%sort%%'' în nume. | ||
- | **Note de subsol** | ||