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
  1. 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.

  2. 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ă.

  3. 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
  4. 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.

  5. 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

  1. Pentru a afișa toate fișierele care încep cu șirul lp se va utiliza:
    ls lp*
  2. Pentru a afișa toate fișierele care încep cu ar și pot să se termine cu orice caracter se va utiliza:
    ls ar?
  3. 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]
  4. 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
  1. 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.
  2. 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?
  3. Creați în directorul propriu două directoare denumite dir1 și dir2.
  4. 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.
  5. Afișati conținutul celor 2 directoare recursiv (folosind ls) și utilizând comanda tree.
  6. 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).
  7. 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).
  8. Ștergeți directorul dir1 folosind comanda rm. Apoi ștergeți directorul dir2 folosind rmdir.
  9. 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.
  10. 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.
  11. Creați 3 fișiere care încep cu “Ana are ” și se termină cu {mere, pere, alune}.
  12. Afișați toate combinările posibile între literele: c, d, e, f și cifrele: 1, 2, 3, 4.
  13. Afișați toate literele alfabetului englez.
  14. 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)
  15. 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.
  16. Modificați data când fișierul ext4 a fost accesat și modificat la 2010.05.23 15:25 (Hint: touch)
  17. 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.
  18. 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?
  19. Scrieți textul “current file system” în ext4 și afișați conținutul lui sym-ext4.
    1. Ștergeți fișireul ext4 și afișați conținutul lui sym-ext4.
    2. Aflați tipul fișierului sym-ext4 (Hint: file)
  20. Creați link-ul hard hard-ext3 către fișierul ext3.
    1. Aflați inode-urile pentru hard-ext3 și ext3. (Hint: stat)
    2. Scrieți textul “old file system” în ext3 și afișați conținutul lui hard-ext3.
    3. Aflati tipul fișierului hard-ext3 (Hint: file)
    4. Ștergeți fișierul ext3 și afișați conținutul lui hard-ext3 - de ce merge?
  1. Creați un fișier de 10 MB denumit random_file (cu date random).
    1. Copiați primii 3 MB din fișierul random_file în fișierul random_1.
    2. Copiați ultimii 7 MB din fișierul random_file în fișierul random_2. Hint: skip
    3. Recreați fișierul de 10 MB folosind doar fișierul random_1 și random_2 (Hint: seek or append, check the man)
    4. Validați rezolvarea cu ajutorul comenzii diff.
  2. 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}}}.
  3. 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
  1. Creați un fișier cu denumirea myfile.dat (puteți folosi touch sau dd)
  2. Rulați comanda:
    tar -cf myfile.tar myfile.dat

    pentru a crea o arhivă tar ce conține fișierul generat anterior.

  3. 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.

  4. 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.

  5. Pentru dezarhivarea unui fișier tar se înlocuiește parametrul c cu parametrul x în comenzile anterioare.
  6. 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.

  7. 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.

  8. 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.

  9. 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
  1. 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.
  2. 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ă.
  3. 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)
  4. Realizați o arhivă cpio cu același conținut. (Hint: folosiți find pentru a-i specifica utilitarului fișierele de arhivat).
  5. 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.
  6. Creați fisierul /home/student/big-text-file.txt care să conțină cel puțin 5 MB text (date aleator generate).
  7. Arhivați fisierul big-text-file.txt în format gzip, bzip2 și zip. Care sunt diferențele de mărime ale arhivelor?
  8. Creați, respectiv, arhivele conf.zip, conf.tar.gz, conf.cpio care conțin fișierele cu extensia .conf din ierarhia /etc/.
  9. 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)
  10. 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.
  11. 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).
  12. 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).
  13. Creați o a doua arhiva care să conțină ambele fișiere file1 și file2.
  14. 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.
  15. 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.
  16. Creați un folder extract unde veți dezarhiva doar fișierul file2 din arhiva.
  17. 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ă.
  18. 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})