Spaceuit Logo Spaceuit Plateforme Éducative

Informatique Appliquée

Fillière Intelligence Artificielle

Hiver 2025

Ali El Hourch
[email protected]


Guide
Nouveau
Assistant AI
Visual Studio Code Google Classroom Whatsapp Whatsapp Discord Discord
Module 1: Probabilités Et Statistiques Module 2: Architecture Des Ordinateurs Module 3: Structure De Données En C Module 4: Système d'exploitation 1 Module 5: Programmation Web 1 Module 6: Langues Etrangéres Module 7: Compétences Culturelles & Artistiques

Semestres

Hiver 2025

Tronc Communs

Informatique Appliquée

Série 3 Système Exploitation


Série 3


Exercice 1


  • Quelles commandes Linux devez-vous exécuter pour obtenir à l’écran :
    Il y a xxx utilisateurs de ce systeme dont le login shell est bash
  • Indication
    • Pour passer la sortie d'une commande à une autre commande, vous pouvez utiliser les caractères $( command ).
      Exemple :
    • echo "Il y a $(ls | wc -l) fichiers dans desktop" # Affiche le nombre de fichiers dans le répertoire courant (desktop)
      
    • Pour obtenir les lignes qui contiennent une chaîne de caractères, utilisez la commande grep [CHAÎNE] [DESTINATION]
    • Pour retourner le nombre de lignes à partir de grep, utiliser l'option -c
    Correction
      echo "Il y a $(grep -c "/bin/bash" /etc/passwd) utilisateurs de ce systeme dont le login shell est bash"
      

Exercice 2


  • En utilisant la commande find, trouvez et listez les noms de :
    1. Tous les fichiers sous le répertoire /etc dont les noms commencent par rc,
    2. Indication
      • Pour trouver les fichiers commençant par le caractère rc, utilisez la séquence "rc* ". Le « * » signifie 0 à n fois caractères, donc "rc*" correspond aux chaînes de caractères qui commencent par les caractères rc.
      • Les fichiers sont :
        • Fichiers réguliers
        • Répértoires
        • Liens symboliques
        • ...
      • Les fichiers réguliers sont :
        • Fichiers textes (e.g., .txt, .csv)
        • Fichiers binaires (e.g, programmes compilé, images, exécutables comme .exe et .com)
        • Scripts executables (e.g, .sh)
      • Utiliser l'option -type f pour trouver les fichiers réguliers.
      Correction
        find /etc -name  "rc*" -print # Recherche dans /etc tous les fichiers dont le nom commence par "rc"
        
    3. Tous les fichiers réguliers vous appartenant ; mettez le résultat dans le fichier /tmp/findmoi et les erreurs dans /dev/null.
    4. Indication
      • Les fichiers sont :
        • Fichiers réguliers
        • Répértoires
        • Liens symboliques
        • ...
      • Les fichiers réguliers sont :
        • Fichiers textes (e.g., .txt, .csv)
        • Fichiers binaires (e.g, programmes compilé, images, exécutables comme .exe et .com)
        • Scripts executables (e.g, .sh)
      • Utiliser l'option -type f pour trouver les fichiers réguliers.
      • Chercher les fichiers réguliers dans $HOME, /tmp, et /var/spool au lieu de simplement rechercher dans / (la racine du système) pour plusieurs raisons :
        1. Efficacité
          • Rechercher dans / (toute la racine) est très lent et consomme beaucoup de ressources car cela inclut tous les fichiers du système, y compris ceux de l’administrateur (root) et d’autres utilisateurs.
        2. Permissions
          • En recherchant dans /, vous risquez de rencontrer de nombreux messages d’erreur “Permission denied”, car certains répertoires et fichiers ne sont accessibles qu’à l’administrateur. Cela rendrait la recherche plus compliquée.
      Correction
        RACINE="$HOME /tmp /var/spool"
        find $RACINE -type f -user $(whoami) -print >/tmp/findmoi 2>/dev/null
        
      • Remarquez que je n'ai pas inclus l'option -print parce que cela cacherait la commande que j'ai exécutée dans le terminal. J'ai donc décidé de ne pas la mentionner, mais la réponse finale devrait l'inclure comme le code fourni ci-dessus.
    5. Tous les sous–répertoires de /etc.
    6. Correction
        find /etc -type d -print # Recherche et affiche tous les répertoires dans /etc
        
    7. Tous les fichiers réguliers se trouvant sous votre répertoire d’accueil et qui n’ont pas été modifiés dans les 10 derniers jours.
    8. Indication
      • Utiliser l'option -mtime [(+/-) n] avec la commande find pour trouver les fichiers qui sont été modifiés aprés, avant ou pendant n jours.
      Correction
        find $HOME -type f -mtime +9 -print # Recherche les fichiers modifiés il y a plus de 9 jours dans le répertoire $HOME
        
      • Remarque

      • $HOME est identique à ~, les deux correspondent à votre répertoire d’accueil.

Exercice 3


  • Trouvez à partir de votre répertoire d’accueil, le nombre de fichiers ayant une taille supérieure à 1 Mega-octets et stockez leurs noms dans un fichier (utilisez la commande tee).
  • Correction
      find ~ -size +1M | tee fichiers.txt | wc -l # Recherche les fichiers de 1 Mo dans le 
                          répertoire d’accueil et enregistre la liste dans fichiers.txt
      

Exercice 4


  • Créez dans le répertoire rep1 les fichiers suivants : fich1, fich2, fich11,
    fich12, fich1a, ficha1, fich33,.fich1, .fich2, toto, afich.
    Listez les fichiers :
    1. Indication
      ┌────┬───────────────────────────────┬─────────────────────────────────────────────────────────────────────────────┐
      │ #  │ Motif                         │ Effet                                                                       │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 1  │ *                             │ Correspond à zéro ou plusieurs caractères.                                  │
      │    │                               │ Exemple : `ba*` correspond à `ba`, `baa`, `baaa`, et tout fichier ou        │
      │    │                               │ dossier commençant par `ba`.                                                │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 2  │ ?                             │ Correspond à exactement un caractère.                                       │
      │    │                               │ Exemple : `ba?` correspond à `baa`, `bab`, `bac`, mais pas `ba` ou `baaa`.  │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 3  │ [abc]                         │ Correspond à un caractère unique parmi ceux indiqués dans les crochets.     │
      │    │                               │ Exemple : `ba[xyz]` correspond à `bax`, `bay` ou `baz`.                     │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 4  │ [!abc]                        │ Correspond à un caractère unique qui n’est pas dans les crochets.           │
      │    │                               │ Exemple : `ba[!xyz]` correspond à `bab`, `bac`, mais pas à `bax`, `bay`.    │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 5  │ [a-z]                         │ Correspond à un caractère dans une plage définie.                           │
      │    │                               │ Exemple : `ba[a-c]` correspond à `baa`, `bab`, ou `bac`.                    │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 6  │ {foo,bar}                     │ Correspond à une des chaînes spécifiées entre accolades.                    │
      │    │                               │ Exemple : `ba{r,z}` correspond à `bar` ou `baz`.                            │
      ├────┼───────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤
      │ 7  │ \                             │ Échappe les caractères spéciaux pour qu’ils soient traités littéralement.   │
      │    │                               │ Exemple : `ba\*` correspond littéralement à `ba*` et non aux fichiers.      │
      └────┴───────────────────────────────┴─────────────────────────────────────────────────────────────────────────────┘
      
    2. Dont les noms commencent par fich,
    3. Correction
      ls fich* # Liste tous les fichiers ou dossiers dont le nom commence par "fich" dans le répertoire courant
      
    4. Dont les noms commencent par fich suivi d’un seul caractère,
    5. Correction
      ls fich?
      
    6. Dont les noms commencent par fich suivi d’un chiffre,
    7. Correction
      ls fich[0-9] 
      
    8. Dont les noms commencent par .,
    9. Correction
      ls .? 
      
    10. Dont les noms ne commencent pas par f,
    11. Correction
      ls [!f]*  
      
    12. Dont les noms contiennent fich.
    13. Correction
      ls *fich*  
      

Exercice 5


  • Écrivez un alias en Bash permettant de lister page par page et dans l’ordre alphabétique l’ensemble des variables d’environnement.
  • Indication
    • Utiliser la commande env ou printenf pour afficher tous les variables d'environnement.
    • Utiliser la commande sort pour trier en ordre alphabétique.
    • Utiliser la commande less ou more pour afficher page par page.
    Correction
    alias en="env | sort | less" 
    # OU
    alias en="printenv | sort | more"
    
  • Après avoir exécuté en :

Exercice 6


  • Créez un fichier de nom -i, puis supprimez-le.
  • Indication
    • Touch -i peut être interprété comme une commande avec l’option -i (souvent invalide ou non prise en charge dans ce contexte).
    • Utilisez ./ pour indiquer que le fichier -i est un nom littéral
    • rm -i est interprété comme une option pour activer le mode interactif (confirmation avant suppression), et non comme une tentative de suppression d’un fichier nommé -i.
    • Pour supprimer un fichier nommé -i, vous pouvez forcer rm à traiter -i comme un fichier en utilisant ./
    Correction
    touch ./-i
    rm ./-i
    

Exercice 7


  • Il arrive souvent de lancer une commande Linux produisant plusieurs pages d’écran à toute vitesse (par exemple : ls /etc). Il faut alors relancer la même commande, en envoyant sa sortie standard dans less, ce qui permet d’examiner le résultat page par page. Si votre shell interactif est le Bash, cela ne doit pas être fastidieux : créez l’alias p qui relance la dernière commande en envoyant sa sortie standard dans la commande less.
  • Indication
    • Pour exécuter la dernière commande lancée, exécutez : fc -s
    Correction
      alias p="fc -s | less"
      
    • Après avoir exécuté p :

Programmation Shell

Exercice 8


  • Écrire un shell script qui écrit sur sa sortie standard les messages suivants :
    mon nom est xxx
    je suis appele avec yyy arguments qui sont: 111 222 333 444
    (xxx sera remplacé par le nom sous lequel ce shell script aura été invoqué, yyy par le nombre d’arguments et 111, 222, etc. par les arguments en question). Quand ce script fonctionnera correctement, invoquez le avec les cinq arguments :
    Bienvenue dans le monde Linux
    puis avec un seul argument contenant la chaîne de caractères : Bienvenue dans le monde Linux
  • Indication
    • Pour créer un fichier bash exécutable, exécutez la série de commandes :
    • $ nano test1.sh 
      -> echo "Bonjour"
          (ctrl + o)
          (entrer)
          (ctrl + x)
      chmod +x test1.sh # Rendre le script exécutable
      $ ./test1.sh
      Bonjour
      
      ╔═══════╦══════════════════════════════════════════╦═══════════════════════════════════════════════╗
      ║ Arg   ║ Description                              ║ Exemple                                       ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $0    ║ Nom du script                            ║ Nom du script : `script.sh`                   ║
      ║       ║                                          ║ Commande : `bash script.sh`                   ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $1    ║ Premier argument                         ║ Premier argument : `foo`                      ║
      ║       ║                                          ║ Commande : `bash script.sh foo`               ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $2    ║ Deuxième argument                        ║ Deuxième argument : `bar`                     ║
      ║       ║                                          ║ Commande : `bash script.sh foo bar`           ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $#    ║ Nombre total d'arguments                 ║ Total d'arguments : `2`                       ║
      ║       ║                                          ║ Commande : `bash script.sh foo bar`           ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $*    ║ Tous les arguments (en une seule chaîne) ║ Tous les arguments : `foo bar baz`            ║
      ║       ║                                          ║ Commande : `bash script.sh foo bar baz`       ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $@    ║ Tous les arguments (individuellement)    ║ Affiche `foo`, `bar`, `baz` dans une boucle   ║
      ║       ║                                          ║ Commande : `bash script.sh foo bar baz`       ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $?    ║ Code de sortie de la dernière commande   ║ Code : `0` (succès) ou autre (erreur)         ║
      ║       ║                                          ║ Commande : `ls /nonexistent ; echo $?`        ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $$    ║ PID (Process ID) du script               ║ PID du script : `12345`                       ║
      ║       ║                                          ║ Commande : `echo $$`                          ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $!    ║ PID du dernier processus en arrière-plan ║ PID : `12346`                                 ║
      ║       ║                                          ║ Commande : `sleep 10 & ; echo $!`             ║
      ╠═══════╬══════════════════════════════════════════╬═══════════════════════════════════════════════╣
      ║ $_    ║ Dernier argument de la dernière commande ║ Dernier argument : `foo`                      ║
      ║       ║                                          ║ Commande : `echo foo ; echo $_`               ║
      ╚═══════╩══════════════════════════════════════════╩═══════════════════════════════════════════════╝
      
    Correction
    • Correction de : Mon nom est xxx
    • $ nano script1.sh
          #!/bin/bash
          echo "Mon nom est $0"
          (ctrl + o)
          (entrer)
          (ctrl + x)
      $ chmod +x script1.sh
      $ ./script1.sh
      Mon nom est ./script1.sh
      
    • Correction de : je suis appele avec yyy arguments qui sont: 111 222 333 444 ...
    • $ nano script2.sh
          #!/bin/bash
          
          echo "je suis appele avec $# arguments qui sont: $*"
          (ctrl + o)
          (entrer)
          (ctrl + x)
      $ chmod +x script2.sh
      $ ./script2.sh  
      je suis appele avec 0 arguments qui sont:
      $ ./script2.sh Bienvenue dans le monde Linux
      je suis appele avec 5 arguments qui sont: Bienvenue dans le monde Linux
      $ ./script2.sh "Bienvenue dans le monde Linux"
      je suis appele avec 1 arguments qui sont: Bienvenue dans le monde Linux
      

Exercice 9


  • Écrire un shell script démontrant que le shell fils hérite de son père, mais que le père n’hérite pas de son fils.
  • Indication
    • Étapes pour prouver cela :
      1. Définir une variable dans le shell père.
      2. Lancer un sous-shell et vérifier que cette variable est accessible dans le sous-shell.
      3. Dans le sous-shell, modifier ou définir une nouvelle variable.
      4. Revenir dans le shell père et vérifier que les changements effectués dans le fils n’affectent pas le père.
    • Pour lancer un subshell dans le même script, vous pouvez utiliser la commande :
    • bash -c ' 
          # instructions 
      '
      
    Correction
      #!/bin/bash
      
      VAR_PERE="Je suis dans le pere"
      export VAR_PERE
      
      echo "Je suis le pere avant le lancement du sous-shell..."
      echo "VAR_PERE = $VAR_PERE"
      
      echo "Lancement du sous-shell..."
      bash -c '
          echo "Je suis le fils"
          echo "VAR_PERE = $VAR_PERE"
          VAR_PERE="Modifie par le fils"
          VAR_FILS="Je suis dans le fils"
          echo "Apres modification : VAR_PERE = $VAR_PERE"
          echo "VAR_FILS = $VAR_FILS"
      '
      
      echo "Retour au shell pere"
      echo "VAR_PERE = $VAR_PERE"
      echo "VAR_FILS = ${VAR_FILS:-Nexiste pas}"
      

Exercice 10


  • En utilisant exclusivement les commandes cd et echo, écrire le shell script "recurls" réalisant la même fonction que la commande ls -R. C’est à dire que la commande recurls rep1 devra lister les noms de tous les fichiers et répertoires situés sous le répertoire rep1, y compris les sous-répertoires et les fichiers qu’ils contiennent. Une solution très simple consiste à rendre le script recurls récursif. (un shell script est récursif s’il s’invoque lui-même).
  • Indication
    • Pour parcourir les fichiers d'un répertoire, écrivez la syntaxe suivante :
    • for i in *
      do
         
      done
      
    • Pour vérifier si un fichier est un répertoire, écrivez :
    • if [ -d "$i" ]
          then
             # instructions
          else 
             # then $i is a file
          fi
      
    Correction
      #!/bin/bash # Indique que le script doit être exécuté avec bash
      
      cd "${1:-.}" # Changer de répertoire vers celui passé en argument ou vers le répertoire courant si aucun n'est fourni
      
      for i in * # Boucle sur tous les fichiers et répertoires du répertoire courant
      do
          if [ -d "$i" ] # Vérifie si "$i" est un répertoire
          then
              echo "$PWD/$i/" # Affiche le chemin complet suivi d'un slash si c'est un répertoire
              echo "$0 $PWD/$i" # Affiche le nom du script suivi du chemin complet du répertoire
          else
              echo "$PWD/$i" # Affiche le chemin complet si c'est un fichier
          fi
      done
      

Exercice 11


  • Écrivez le script "rename" permettant de renommer un ensemble de fichiers. Par exemple rename ’.c’ ’.bak’ aura pour effet de renommer tous les fichiers d’extension .c en .bak. les fichiers f1.c et f2.cdeviennent f1.bak et f2.bak. Utilisez la commande basename.
  • Indication
    Correction
      #!/bin/bash # Indique que le script utilise bash
      
      if [ "$#" -ne 2 ]
      then
          echo "Entrer 2 arguments! Example: rename '.c' '.bak'" >&2 # Affiche un message d'erreur si le nombre d'arguments n'est pas 2
          exit 1 # Quitte le script avec un code d'erreur
      fi
      
      for i in *"$1" # Parcourt tous les fichiers correspondant au premier argument
      do
          nom_fichier=$(basename "$i" "$1") # Extrait le nom du fichier sans le chemin
          mv "$nom_fichier$1" "$nom_fichier$2" # Renomme le fichier en remplaçant l'extension
          echo "$nom_fichier$1 ---> $nom_fichier$2" # Affiche le changement de nom
      done
      

Exercice 12


  • Et si Vi gardait une copie de secours ?
    Vi est un peu délicat à maîtriser au début, et si on sort par :wqaprès avoir fait une gaffe, tout est perdu. Ecrivez donc un petit script en Bash qui crée une copie de secours. Appelons le svi, pour Safe VI. La commande svi fich1 devra invoquer vi fich1, mais laisser derrière elle un fichier fich1.bak contenant la version d’origine de fich1. Pensez aux deux cas suivants :
    • Si je dis : svi tralala et que tralala n’existe pas?
    • Si je dis : svi fich1.bak, que se passe-t-il?
  • Indication
    Correction
      #!/bin/bash # Indique que le script utilise bash
      
      if [ "$#" -eq 1 ] # Vérifie si un seul argument est passé
      then
          fichier="$1" # Stocke le nom du fichier dans la variable fichier
      
          if [[ "$fichier" != *.bak ]] # Vérifie si le fichier n'a pas l'extension .bak
          then
              if [ -e "$fichier" ] # Vérifie si le fichier existe
              then
                  echo "Le fichier existe, une copie sera créée" # Informe que le fichier existe
                  cp "$fichier" "$fichier.bak" # Crée une copie avec l'extension .bak
                  if [ "$?" -ne 0 ] # Vérifie si la commande cp a échoué
                  then
                      echo "Impossible de créer une sauvegarde $fichier.bak" >2 # Affiche un message d'erreur
                      exit 1 # Quitte le script avec un code d'erreur
                  fi
                  echo "Sauvegarde créée : $fichier.bak" # Informe que la sauvegarde a été créée
                  vi "$fichier" # Ouvre le fichier avec l'éditeur vi
              else
                  echo "Le fichier n'existe pas. Il sera créé." # Informe que le fichier n'existe pas
                  touch "$fichier" # Crée un fichier vide
                  if [ "$?" -ne 0 ] # Vérifie si la commande touch a échoué
                  then
                      echo "Impossible de créer le fichier $fichier" >2 # Affiche un message d'erreur
                      exit 1 # Quitte le script avec un code d'erreur
                  fi
                  echo "Fichier créé" # Informe que le fichier a été créé
                  vi "$fichier" # Ouvre le fichier avec l'éditeur vi
              fi
          else
              echo "ATTENTION! $1 est ouvert en lecture seule" # Informe que le fichier est ouvert en mode lecture seule
              sleep 4 # Attend 4 secondes
              vi -r "$fichier" # Ouvre le fichier en lecture seule avec vi
          fi
      else
          echo "ERREUR! Ce script doit être invoqué avec un seul argument" >2 # Affiche un message d'erreur
          echo "USAGE: svi nom_fichier" >2 # Affiche l'usage correct du script
          exit 0 # Quitte le script avec succès
      fi