====== 3. Operații avansate cu fișiere ====== Sistemul de fișiere reprezintă componenta cea mai vizibilă din cadrul unui sistem de operare. Un utilizator folosește sistemul de fișiere prin operații de creare, ștergere, modificare și investigare a fișierelor. Mai mult, un utilizator poate administra sistemul de fișiere prin configurarea de permisiuni, prin stabilirea de cote de sistem de fișiere și prin acțiuni de formatare și montare de sisteme de fișiere. ===== Subiecte abordate ===== * Comenzi avansate de lucru cu fișiere: ''find'', ''stat'', ''ln'', ''dd'' * Globbing ==== Utilitare folosite ==== * ''find'', ''xargs'' * ''ln'', ''dd'' ==== Bune practici ==== * Construcția ''%%$(...)%%'' versus ''xargs'' * Obținerea listei de fișiere dintr-un director: ''ls'' vs. ''find'' vs. Bash arrays; ''for'' vs. ''%%$(...)%%'' ==== Slide-uri ==== [[http://koala.cs.pub.ro/training/res/linux-admin/slides/cap-03.pdf|Slide-uri capitol 3]]
===== Exerciții ===== ==== Demo-uri ==== Folosirea comenzii ''find'' cu diverși parametri pentru a parcurge sistemul de fișiere. Afișarea executabilelor cu bitul de setuid activat din directoarele ce conțin executabile (''/bin'', ''/sbin'', ''/usr/bin'', ''/usr/sbin''). Folosirea comenzii ''dd'' pentru a copia chunk-uri de fișiere. Opțiunile ''bs'', ''count'', ''skip'', ''seek''. Exemplificarea globbing-ului ==== Exercițiu 1 ==== Dorim să afișăm fișiere după diferite considerente. Folosiți ''find'' pentru a afișa toate **fișierele** din ierarhia ''/etc/'' (adică toate fișierele din ''/etc/'', din subdirectoarele acestuia, din subdirectoarele subdirectoarelor etc.). **Indicație**: Folosiți opțiunea ''-type'' a comenzii ''find''. Folosiți ''find'' pentru a afișa toate fișierele din ierarhia ''/etc/'' al căror nume începe cu litere între ''a'' și ''d''. **Indicații**: Folosiți opțiunea ''-name'' a comenzii ''find''. Folosiți construcția ''[a-d]*'' pentru a indica un șir care începe cu o literă între ''a'' și ''d'' urmată de orice altceva. Folosiți ''find'' pentru a afișa toate fișierele din ierarhia ''/etc/'' al căror nume începe cu litere între ''a'' și ''d'' și are extensia ''.conf'' (adică se încheie în șirul ''.conf''). **Indicație**: Porniți de la comanda anterioară și extindeți argumentul transmis opțiunii ''-name''. Folosiți ''find'' pentru a afișa toate fișierele din ierahia ''/etc/'' care sunt deținute de utilizatorul ''root'' și grupul ''root''. **Indicație**: Folosiți optiunea ''-user'' a comenzii ''find''. Folosiți ''find'' pentru a a afișa toate fișierele din ierahia ''/etc/'' care sunt deținute de utilizatorul ''root'' și un grup diferit de ''root''. **Indicație:** Folosiți ''!'' (semnul exclamării în fața opțiunii necesare pentru a o nega). Folosiți ''find'' pentru a a afișa toate fișierele din ierahia ''/etc/'' pentru care ''others'' au permisiuni de orice fel (adică ''others'' au **oricare** dintre permisiunile //read//, //write// sau //execute//). **Indicații**: Urmăriți opțiunea ''-perm'' în pagina de manual a comenzii ''find''. Urmăriți și exemplele de folosire căutând după șirul ''EXAMPLES''. Folosiți ''find'' pentru a a afișa toate fișierele din ierahia ''/etc/'' pentru care ''others'' nu au nici un fel de permisiuni (de orice fel: //read//, //write// sau //execute//). **Indicație:** Folosiți ''!'' (semnul exclamării în fața opțiunii necesare pentru a o nega). ==== Exercițiu 2 ==== Listați primele 10 **fișiere obișnuite** (//regular files//) din ierarhia ''/etc'' (adică din toate directoarele, subdirectoarele și subdirectoarele acestora etc.) sortate în ordinea dimesiunii ocupate de fiecare fișier. Folosiți ''find'' cu opțiunea ''-exec'', ''stat'' (cu opțiunea ''-c'' și formatul necesar pentru afișarea dimensiunii și numelui ca argument către opțiunea ''-exec'' a lui ''find''), ''sort'' și ''head''. Exemplu de rulare pentru ''find'' cu ''-exec'' este find /etc/ -type f -exec ls -l {} \; ==== Exercițiu 3 ==== Creați un fișier care să conțină 2048 de octeți de zero (din ''/dev/zero'') urmați de 2048 de octeți aleatori (din ''/dev/urandom'') urmați de 2048 de octeți de zero și apoi urmați de 2048 de octeți din fișierul ''/bin/false'' de la offsetul 4096 al fișierului. Argumentul pentru opțiunile ''skip'' și ''seek'' ale comenzii ''dd'' este dat în număr de blocuri, **nu** în număr de octeți. ==== Exercițiu 4 ==== Folosiți ''/dev/urandom'', ''dd'' și ''split'' pentru a genera, într-un one liner, 100 de fișiere a câte 100 de octeți aleatori cu numele ''partXYZ.dat'' unde ''XYZ'' sunt valorile 000, 001, ..., 099. Adică ''part000.dat'', ''part001.dat'', ..., ''part099.dat''. ''dd'' poate scrie la standard output în **absența** opțiunii ''of''. ''split'' poate citi de la standard input dacă se folosește construcția ''-'' (semnul minus) pentru numele fișierului. ==== Exercițiu 5 ==== 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: training@box:~$ 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 ''training'' (''/home/training'') 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 output-ul comenzii zip --help după opțiunea care trece recursiv prin directoare (//recurse into directories//). Comanda ''unzip'' dezarhivează o arhivă ''.zip'' dar are și o opțiunea de listare a conținutului acelei arhive fără a o dezarhiva însă. Identificați acea opțiune.