=== 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}}})