# Travaux pratiques (autres commandes UNIX)

Cette seconde série de travaux pratiques se décompose en 4 parties :

1. commandes utilisateurs,
2. gestion des droits,
3. archivage et décompression,
4. gestion des processus.

## Commandes utilisateurs

Identifiez-vous : quels sont votre *user id* (`uid`) et votre groupe (`gid`) ?

<details>
<summary>Voir la solution</summary>

```bash
$ whoami
[votre username]
$ id
uid=[votre username] gid=users
```

</details>

## Gestion des droits

- En restant dans votre répertoire de travail (`UnixShell`), listez complètement
  le contenu de votre *home directory*.  
  Décrivez ce que vous y trouvez :

    <details>
    <summary>Voir la solution</summary>

    `UnixShell` est à 2 niveaux sous votre *home directory*:

    ```bash
    ll ../..
    ```

    </details>

  - quels sont les fichiers et répertoires présents ?

      <details>
      <summary>Voir la solution</summary>

      Des répertoires comme : `./ ../ Formation/`  
      Des fichiers comme : `.profile`

      </details>

  - lesquels sont cachés ?

      <details>
      <summary>Voir la solution</summary>

      Tous ceux qui commencent par un point comme `.profile`

      </details>

  - quels sont leurs propriétaires et groupes attachés ?

      <details>
      <summary>Voir la solution</summary>

      Propriétaires : surtout vous, éventuellement l'utilisateur `root`  
      Groupes : le vôtre, éventuellement d'autres

      </details>

  - quels sont les droits afférants ?

      <details>
      <summary>Voir la solution</summary>

      Possiblement variable, mais dépendant surtout de votre `umask` (voir la suite)

      </details>

- Copiez dans votre répertoire `UnixShell` le fichier
  [`testUmask.txt`](./testUmask.txt) (par un clic droit sur ce lien puis
  "*Enregistrez la cible du lien sous*" ou "*Save link as*").  
  Ses droits initiaux sont `rwxrwxr-x`.  
  Quel est votre `umask` ?

  <details>
  <summary>Voir la solution</summary>

  Dépend de votre configuration, mais s'observe en faisant un `ll` pour afficher les droits pris par le fichier `testUmask.txt` lors de la copie sous votre compte.  
  En prenant pour exemple les droits présentés plus haut : `rwxrwxr-x`

  ```txt
  user (u)  : rwx, binaire 111 octal 7
  group (g) : rwx, binaire 111 octal 7
  other (o) : r-x, binaire 101 octal 5
  ```

  Donc profil octal 775, d'où un `umask` de 002 (sa négation en octal).  
  On peut aussi lancer `umask` comme commande en ligne...
  </details>

- Modifiez les droits de ce fichier `testUmask.txt` de deux façons pour obtenir ceux qui suivent, en séquence pour les trois cas de proche en proche :
  
  - `rwx------`
  - `rwxrwxrwx`
  - `rwxr-xr--`
  
  La première façon de procéder utilisera un profil octal, la seconde des lettres. Contrôlez vos actions à chaque étape.

  <details>
  <summary>Voir la solution</summary>

  - `rwx------`

    ```bash
    $ chmod 700 testUmask.txt
    $ chmod go-rwx testUmask.txt
    $ ll
    -rwx------ 1 [uid] users 36 May 5 13:04 testUmask.txt
    ```

  - `rwxrwxrwx`

    ```bash
    $ chmod 777 testUmask.txt
    $ chmod a+rwx testUmask.txt
    $ ll
    -rwxrwxrwx 1 [uid] users 36 May 5 13:05 testUmask.txt
    ```

  - `rwxr-xr--`

    ```bash
    $ chmod 754 testUmask.txt
    $ chmod go-w,o-x testUmask.txt
    $ ll
    -rwxr-xr-- 1 [uid] users 36 May 5 13:06 testUmask.txt
    ```

  </details>

- Cherchez le chemin où se trouve votre fichier .profile, à partir de votre home directory, sans changer de répertoire.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  find ~ -name .profile
  ```

  </details>

- Copiez dans votre répertoire `UnixShell` le fichier
  [`testDiff1.txt`](./testDiff1.txt) (par un clic droit sur ce lien).  
  Ouvrez-le dans un éditeur et modifiez-le selon les consignes qui s'y trouvent.  
  Ensuite, sauvegardez-le comme `testDiff2.txt`.  
  Comparez les deux fichiers, analysez le rapport obtenu en fonction de vos actions.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  $ diff testDiff1.txt testDiff2.txt
  3a4
  > LIGNE AJOUTEE
  6d6
  < LIGNE A SUPPRIMER
  9c9
  < Modifiez-moi !!!
  ---
  > Modifiée
  ```

  </details>

## Archivage et compression

- Archivez en un seul *tarfile* tout le contenu de votre répertoire `UnixShell` (placez-vous au-dessus).  
  Contrôlez le fichier `.tar` résultat.

  <details>
  <summary>Voir la solution</summary>

  Le plus simple est d'abord de vous déplacer dans le répertoire parent de `UnixShell` pour l'archiver :

  ```bash
  $ cd ..
  $ pwd
  / ... /Formation
  $ ll
  drwxrwxr-x  4 [uid] [gid]  1024 Apr  5 13:15 ./
  drwxrwxr-x 16 [uid] [gid]   512 Apr 25 16:35 ../
  drwxrwxr-x  4 [uid] [gid]  1024 Apr 25 10:03 UnixShell
  ```

  ```bash
  $ tar -cvf Archives.tar UnixShell
  $ ll
  drwxrwxr-x  4 [uid] [gid]  1024 Apr  5 13:15 ./
  drwxrwxr-x 16 [uid] [gid]   512 Apr 25 16:35 ../
  drwxrwxr-x  4 [uid] [gid]  1024 Apr 25 10:03 UnixShell
  -rwxrwxr-x  1 [uid] [gid] 10240 May  5 14:23 Archives.tar
  ```

  </details>

- Créez le sous-répertoire `tarzip` (sous `UnixShell` où vous revenez) et déplacez-y votre *tarfile*.  
  Sans vous déplacer dans ce sous-répertoire, désarchivez le *tarfile* et contrôlez le résultat.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  $ cd UnixShell
  $ pwd
  / ... /Formation/UnixShell
  ```

  ```bash
  $ mkdir tarzip
  $ mv ../Archives.tar tarzip
  ```

  ```bash
  $ tar -xvf tarzip/Archives.tar
  UnixShell/
  UnixShell/monHistorique.txt
  UnixShell/testDiff1.txt
  UnixShell/testDiff2.txt
  ```

  ```bash
  $ ll
  drwxrwxr-x 4 [uid] [gid]   512 May  5 15:25 ./
  drwxrwxr-x 4 [uid] [gid]  1024 Apr 25 10:03 ../
  drwxrwxr-x 4 [uid] [gid]  1024 May  5 14:23 UnixShell/
  -rwxrwxr-x 1 [uid] [gid]   212 May  5 10:10 monHistorique.txt
  drwxrwxr-x 2 [uid] [gid]   512 May  5 15:18 tarzip/
  -rwxrwxr-x 1 [uid] [gid]   261 May  5 14:12 testDiff1.txt
  -rwxrwxr-x 1 [uid] [gid]   249 May  5 14:13 testDiff2.txt
  ```

  Si vous avez travaillé comme cela, vous devez constater que le répertoire `UnixShell` s'est désarchivé sous lui-même...  
  C'est bien sûr un exemple se voulant surtout didactique.  
  Dans une situation plus concrète, le désarchivage doit s'opérer aux endroits les plus adéquats !
  </details>

- Toujours en restant sous `UnixShell`, compressez le *tarfile* en `.gz`.  
  Affichez ensuite les informations relatives aux tailles de fichiers et au ratio de compression.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  $ gzip tarzip/Archives.tar
  $ ll tarzip
  -rwxrwxr-x  1 [uid] [gid] 612 May   5 16:23 Archives.tar.gz
  ```

  ```bash
  $ gzip -l tarzip/Archives.tar.gz
  compressed uncompr. ratio uncompressed_name
  612        10240    94.3% tarzip/Archives.tar
  ```

  </details>

- Toujours en restant sous `UnixShell`, décompressez le `tarfile.gz` sur le disque.  
  Puis vérifiez le résultat en listing complet.  
  Recompressez le *tarfile* et contrôlez de nouveau.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  $ gunzip tarzip/Archives.tar
  $ ll tarzip
  -rwxrwxr-x  1 [uid] [gid] 10240 May   5 14:23 Archives.tar
  ```

  ```bash
  $ gzip tarzip/Archives.tar
  -rwxrwxr-x  1 [uid] [gid] 612 May   5 16:48 Archives.tar.gz
  ```

  </details>

- Toujours en restant sous `UnixShell`, et sans décompresser le `tarfile.gz` sur
  le disque, comptez le nombre de lignes non compressées qu'il renferme.

  <details>
  <summary>Voir la solution</summary>

  ```bash
  $ gunzip -c tarzip/Archives.tar | wc -l
  ```

  </details>
