=== Elemente de bază pentru gestiunea fișierelor === ==== Cheatsheet ==== ^ Comandă ^ Descriere ^ | **''.''** | directorul curent | | **''..''** | directorul părinte | | **''cd''** | schimbă directorul curent | | **''cp''** | copiază un fișiere sau director dintr-o locație în alta | | **''stat''** | afișează statistici fișier | | **''file''** | determină formatul unui fișier | | **''tree''** | listează conținutul directoarelor într-un format arborescent | | **''mkdir''** | creează un director | | **''ls''** | listează conținutul unui director | | **''ls -l''** | listează informații despre intrări, printre care și tipul intrărilor| | **''rmdir''** | șterge un director gol | | **''tar''** | creează o arhivă de tip {{{tar}}} | | **''dd''** | realizează copierea la nivel de byte | | **''gzip''** | creează o arhivă comprimată {{{gzip}}} | | **''bzip2''** | creează o arhivă comprimată {{{bzip2}}} | | **''find''** | caută fișiere ce corespund criteriilor specificate | | **''mv''** | mută/redenumește un fișiere/director | | **''rm''** | șterge un fișiere/director | | **''touch''** | schimbă timpul de creare/acces/modificare a unui fișier/director | | **''cpio''** | crează o arhivă de tip {{{cpio}}} | | **''gunzip''** | dezarhivează un fișier de tip {{{gzip}}} | | **''xz''** | arhivează și dezarhivează fișiere de tip {{{xz}}} sau {{{lzma}}} | | **''lzma''** | echivalent cu **xz %%--%%format=lzma** | ==== Operații de bază cu fișiere ==== ===== Tutorial ===== # Rulați comanda: dd if=/dev/zero of=/home/student/myfile.dat bs=1M count=2 pentru a crea un fișier plin cu octeți 0 de 2 MB. # Pentru a crea un fișier cu denumirea ''my-file'' (fișierul va fi gol), folosiți comanda: touch my-file #* Rulați comanda: ls -l my-file Ce dimensiune are acest fișier? #* Pentru a modifica numele fișierului creat anterior se va utiliza: mv my-file new_file ''Atenție!'' Se va suprascrie fișierul ''new_file'' dacă acesta există. # Pentru a crea atât un director țintă, cât și toate celelalte directoare din calea către el, rulați comanda: mkdir -p /home/student/My/Long/Folder # Duceți-vă în directorul creat anterior: cd /home/student/My/Long/Folder #* Creați 2 fișiere: {{{file1}}} și {{{file2}}}. #* Pentru a șterge un fișier, rulați comanda: rm file1 #* Copiați în directorul curent fișierul creat la primul exercițiu: cp /home/student/my-file . #* Mutați-vă în directorul părinte: cd .. #* Pentru a șterge un director, rulați comanda: rm -r Folder Același lucru se poate realiza și cu comanda {{{rmdir}}} dacă directorul este **gol**. # Intrați în directorul {{{/etc/rc2.d}}} și rulați comanda {{{ls -l}}}. Ce semnificație credeți că au caracterele {{{-}}} și {{{l}}} de la începutul liniilor din output? Ce alte caractere ați mai întâlnit în aceeași poziție? ====== File Globbing ===== | **''*''** | se expandează la orice și oricâte caractere | | **''?''** | se expandează orice caracter | | **''[]''** | se expandează la orice caracter din interiorul parantezelor | | **''{}''** | se expandeaza la un sir de caractere din interiorul acoladelor| **Exemple** # Pentru a afișa toate fișierele care încep cu șirul ''lp'' se va utiliza: ls lp* # Pentru a afișa toate fișierele care încep cu ''ar'' și pot să se termine cu orice caracter se va utiliza: ls ar? # Pentru a afișa toate fișierele care încep cu ''ar'' și se pot termina în orice cifra se va utiliza: ls ar[0-9] # Pentru a afișa toate fișierele care încep cu ''file_'' și se pot termina în ''deny'' sau ''allow'' se va utiliza: ls file_{deny,allow} ''Atenție!'' Nu se pune spațiu între ''deny'' și ''allow''. ===== Exerciții ===== # Creați trei fișiere, denumite ''unu'', ''doi'' și ''trei'' în directorul propriu (//home//) și afişați-le folosind comanda {{{ls}}}. Adăugați apoi parametrul ''-l'' comenzii ''ls'' pentru a afișa mărimile acestor fișiere. #* Fișierul ''trei'' va fi creat utilizând comanda {{{dd}}}, dați ce dimensiune doriți. #* Afișarea în formatul ''human readable'' se face utilizând și parametrul ''-h''. # Așteptați un minut după crearea fișierelor de mai sus. Folosiți comanda {{{touch}}} pe fișierul {{{unu}}}. Folosiți, din nou, comanda {{{ls -l}}}. Ce observați? # Creați în directorul propriu două directoare denumite ''dir1'' și ''dir2''. # Mutați fișierul ''unu'' în directorul ''dir1''. Mutați fișierele ''doi'' și ''trei'' în directorul ''dir2'' dintr-o singură comandă. Mutați directorul ''dir1'' în directorul ''dir2''. # Afișati conținutul celor 2 directoare recursiv (folosind {{{ls}}}) și utilizând comanda {{{tree}}}. # Creați un nou fișier cu numele ''patru'' și încercați să îl mutați în directorul ''dir1'' redenumindu-l ''unu''. Mutarea trebuie să se facă doar dacă utilizatorul confirmă suprascrierea fișierului ''unu'' (Hint: man mv, overwrite). # Schimbați directorul curent în ''dir2'' și copiați conținutul acestuia un nivel mai sus, în directorul propriu. Copierea directoarelor trebuie făcută recursiv, cu parametrul adecvat. Folosiți wildcard-ul {{{*}}} (star). # Ștergeți directorul {{{dir1}}} folosind comanda {{{rm}}}. Apoi ștergeți directorul {{{dir2}}} folosind {{{rmdir}}}. # Creați un folder cu numele {{{mod}}} și modificați-l astfel încât să aiba drepturile 777 #* Utilizați chmod #* Utilizați doar comanda mkdir (Hint: {{{man mkdir}}}) #* După ce ați terminat validați drepturile. # Creați 10 fișiere cu denumirile: file0, file2...file9. #* {{{touch}}} de 10 ori - nah, too much work #* Utilizând **brace expansion** - folosit pentru generarea de șiruri - (Eg: echo {1..10}) #* Afișați doar fișierele care încep cu ''file''. # Creați 3 fișiere care încep cu "Ana are " și se termină cu {{{{mere, pere, alune}}}}. # Afișați toate combinările posibile între literele: {{{c, d, e, f}}} și cifrele: {{{1, 2, 3, 4}}}. # Afișați toate literele alfabetului englez. # Creați în directorul {{{/home/student}}} următoarea structură de directoare {{{/home/student/the/unix/file/system/sure/it/corrupts/your/data/but/look/how/fast/it/is}}}. (Hint: opțiunea {{{parent}}} a comenzii {{{mkdir}}}) # Intrați în directorul {{{/home/student/the/unix/file/system/sure/it/corrupts/your/data/but/look/how/fast/it/is}}} și creați trei fișiere, denumite {{{ext2}}}, {{{ext3}}} și {{{ext4}}}. # Modificați data când fișierul {{{ext4}}} a fost accesat și modificat la 2010.05.23 15:25 (Hint: {{{touch}}}) # Verificați faptul că modificările au fost aplicate. Care este inode-ul fișierului {{{ext4}}} ? (Hint: {{{stat}}}) #* Utilizați comanda {{{stat}}} pentru a afișa doar numele și inode-ul fișierului. # Creați link-ul simbolic {{{sym-ext4}}} către fișierul {{{ext4}}}. (Hint: {{{man ln}}}, căutați "symbolic") #* De ce nu e bine să utilizezi căi relative la crearea unui link simbolic? # Scrieți textul "current file system" în {{{ext4}}} și afișați conținutul lui {{{sym-ext4}}}. ## Ștergeți fișireul {{{ext4}}} și afișați conținutul lui {{{sym-ext4}}}. ## Aflați tipul fișierului {{{sym-ext4}}} (Hint: {{{file}}}) # Creați link-ul hard {{{hard-ext3}}} către fișierul {{{ext3}}}. ## Aflați inode-urile pentru {{{hard-ext3}}} și {{{ext3}}}. (Hint: {{{stat}}}) ## Scrieți textul "old file system" în {{{ext3}}} și afișați conținutul lui {{{hard-ext3}}}. ## Aflati tipul fișierului {{{hard-ext3}}} (Hint: {{{file}}}) ## Ștergeți fișierul {{{ext3}}} și afișați conținutul lui {{{hard-ext3}}} - de ce merge? # Creați un fișier de 10 MB denumit {{{random_file}}} (cu date random). ## Copiați primii 3 MB din fișierul {{{random_file}}} în fișierul {{{random_1}}}. ## Copiați ultimii 7 MB din fișierul {{{random_file}}} în fișierul {{{random_2}}}. {{{Hint: skip}}} ## Recreați fișierul de 10 MB folosind doar fișierul {{{random_1}}} și {{{random_2}}} (Hint: {{{seek}}} or {{{append}}}, check the man) ## Validați rezolvarea cu ajutorul comenzii {{{diff}}}. # Utilizați comanda {{{find}}} pentru a găsi toate fișierele din {{{/etc}}} care se termină în ''.allow'' sau ''.deny'' {{{Hint: {{{man find}}}, look after operators}}}. # Comanda {{{find}}} poate executa anumite comenzi pe fișierele găsite utilizând următoarea sintaxa: find location -name pattern -exec cp {} . \; {} - se va expanda la denumirea fișierului găsit (cu tot cu calea dată spre căutare) #* Utilizând comanda {{{find}}} copiați toate fișierele găsite în {{{/etc}}} (nu trebuie verificate alte directoare din {{{/etc}}}) cu extensia {{{.conf}}} în directorul curent cu denumirea {{{nume_initial-copie}}} (Hint: maxdepth). ==== Lucrul cu arhive ==== ===== Tutorial ===== # Creați un fișier cu denumirea myfile.dat (puteți folosi {{{touch}}} sau {{{dd}}}) # Rulați comanda: tar -cf myfile.tar myfile.dat pentru a crea o arhivă tar ce conține fișierul generat anterior. # Rulați comanda: tar -czf myfile.tar.gz myfile.dat pentru a crea o arhivă tar.gz ce conține fișierul generat anterior, comprimat folosind metoda gzip. # Rulați comanda: tar -cjf myfile.tar.bz2 myfile.dat pentru a crea o arhivă tar.gz ce conține fișierul generat anterior, comprimat folosind metoda bzip2. # Pentru dezarhivarea unui fișier {{{tar}}} se înlocuiește parametrul {{{c}}} cu parametrul {{{x}}} în comenzile anterioare. # Pentru a crea o arhivă {{{gzip}}} fără a folosi {{{tar}}}, se folosește utilitarul {{{gzip}}}: gzip -c myfile.dat > myfile.dat.gz În mod analog se crează arhive {{{bzip2}}} folosind utilitarul {{{bzip2}}}. # Pentru dezarhivarea unui fișier comprimat {{{gzip}}} se folosește utilitarul {{{gunzip}}}: gunzip -c myfile.dat.gz > myfile.dat Pentru fișiere {{{bzip2}}} se folosește utilitarul {{{bunzip2}}}. # Utilitarul cpio primește la stdin lista fișierelor de arhivat și scoate la stdout arhiva. Exemplu de utilizare: ls | cpio -ov > archive.cpio Pentru dezarhivare: cpio -idv < archive.cpio Căutați în pagina de manual la ce sunt necesari acești parametri. # Pentru a comprima o arhivă în format {{{xz}}} sau {{{lzma}}} se rulează: xz archive.tar # rezultă archive.tar.xz lzma archive.tar # rezultă archive.tar.lzma Pentru decomprimare: unxz archive.tar.xz # rezultă archive.tar unlzma archive.tar.lzma # rezultă archive.tar Se poate folosi și utilitarul tar: tar -c --xz -f archive.tar.xz /directory # results in archive.tar.xz tar -x --xz -f archive.tar.xz # results in /directory ===== Exerciții ===== # Arhivați directorul {{{/home/student/the/unix}}} (creat într-un exercițiu anterior) cu toate fișierele și subdirectoarele conținute de acesta într-o arhivă {{{unix.tar}}}. Atenție: doar arhivați directorul, nu îl și comprimați. # Arhivați din nou directorul {{{/home/student/the/unix}}} cu toate fișierele și subdirectoarele conținute de acesta într-o arhivă {{{unix.tar.gz}}}. De data aceasta comprimați arhiva. Observați diferența de mărime față de arhiva anterioară. # Afișați conținutul arhivei {{{unix.tar}}} fără a o dezarhiva. (Hint: {{{man tar}}}, căutați "list". Nu uitați să specificați numele arhivei prin {{{-f}}}) # Realizați o arhivă {{{cpio}}} cu același conținut. (Hint: folosiți {{{find}}} pentru a-i specifica utilitarului fișierele de arhivat). # Folosiți {{{apt-cache show atool}}} pentru a afișa informații despre pachetul {{{atool}}}. Instalați pachetul și realizați, respectiv, arhive {{{.tar.gz}}}, {{{.tar.bz2}}}, {{{.zip}}}, {{{.cpio}}}, {{{.Z}}}. # Creați fisierul {{{/home/student/big-text-file.txt}}} care să conțină cel puțin 5 MB text (date aleator generate). # Arhivați fisierul {{{big-text-file.txt}}} în format {{{gzip}}}, {{{bzip2}}} și {{{zip}}}. Care sunt diferențele de mărime ale arhivelor? # Creați, respectiv, arhivele {{{conf.zip}}}, {{{conf.tar.gz}}}, {{{conf.cpio}}} care conțin fișierele cu extensia {{{.conf}}} din ierarhia {{{/etc/}}}. # Creați o ierarhie de fișiere și directoare în {{{/home/student/usr}}} care să conțină toate directoarele și toate fișierele din /usr care au inclus în numele lor șirul 'stdio' folosind comanda {{{cpio}}}. Ierarhia trebuie păstrată. (Hint: {{{cpio pass through}}}) # Comprimați directorul {{{/home/student/the/unix}}} cu toate fișierele și subdirectoarele conținute de acesta în două arhive {{{unix.tar.xz}}} și {{{unix.tar.lzma}}} folosind direct utilitarul tar. Comparați dimensiunea arhivelor rezultate cu dimensiunea arhivei de la exercițiul 1. # Creați un nou fișier {{{file1}}} de 5MB conținând date random (utilizați ''/dev/urandom'') și un folder numit {{{tar-power}}}. Arhivați acest fișier (fără comprimare) astfel încât arhiva să se găsească în folderul {{{tar-power}}} (Hint: {{{man tar}}}, ''change directory''). # Creați un nou fișier {{{file2}}} de 7MB conținând zero-uri și adăugați-l în arhivă (nu creați arhiva de la 0). # Creați o a doua arhiva care să conțină ambele fișiere {{{file1}}} și {{{file2}}}. # Suprascrieți fișierul {{{file1}}} astfel încât acesta să conțină alte date (dimensiunea sa fie tot 5MB). Se poate verifica dacă fișierul dintr-o arhivă este diferit de cel nearhivat utilizand parametrul {{{-d}}}. # Adăugați fișierul {{{file1}}} în ambele arhive însă utilizând diferite moduri: #* Utilizând ''append'' #* Utilizând ''update'' #* Rulați comanda {{{diff}}} pe cele 2 arhive. Ce observati? #* Arhivele sunt identice din cauză ca {{{update}}} nu suprascrie fișierul în arhiva, ci doar îl adaugă la sfârșit - se poate verifica ușor listând conținutul arhivei. #* Concatenați cele 2 arhive păstrând conținutul într-una dintre arhive (Hint: {{{man tar}}}, concatenate). #** ''Atentie!'' Cele 2 arhive ar trebui să aibă același format deoarece concatenarea nu va verifica compatibilitatea între ele. #* Dacă se dorește păstrarea fișierelor din arhiva, în cazul în care se dorește să se facă update la arhivă (să se adauge diferite fișiere), se poate utiliza parametrul {{{-k}}}. # Creați un folder {{{extract}}} unde veți dezarhiva doar fișierul {{{file2}}} din arhiva. # Extrageți din arhivă fișierul {{{file1}}} inițial. #* Nu se va putea realiza adăugând doar numele deoarece se vor dezarhiva ambele versiuni ale fișierului, iar cea mai veche va fi suprascrisă. #* Utilizați {{{--occurrence=nr}}} pentru a specifica care apariție să fie dezarhivată. # Creați un link simbolic spre cele 2 fișiere {{{file1}}} și {{{file2}}} și arhivați cele 2 link-uri într-o nouă arhivă, astfel încât în arhivă rezultată să se găsescă fișierele (Hint: {{dereference}}})