mkdir ./rep1/rep4 ./rep1/rep5 touch ./rep1/fich1 ./rep1/fich2 ./rep1/fich1a ./rep1/ficha1 ./rep1/fich33 ./rep1/.fich1 ./rep1/.fich2 ./rep1/toto ./rep1/afich
Examen système d'exploitation 1 2020 SMI (S3) Normale
Examen PDF
Exercice 1: Commandes de base Unix
- Nous supposons que votre répertoire de travail (˜) contient l'arborescence suivante : (les noms commençant par rep désignent des répertoires et ceux qui commencent par fich désignent des fichiers) :
|---rep1 |---fich11 |---fich12 |---rep2 | |---fich21 | |---fich22 |---rep3 | |---fich31 | |---fich32
- Créez, en utilisant que des chemins relatifs (dites pourquoi quand ce n'est pas possible) :
- Les deux répertoires rep4 et rep5 du même niveau que rep2 et rep3 dans rep1.
- Dans le répertoire rep1 les fichiers suivants fich1,fich2,fich11,fich12,fich1a,ficha1,fich33,.fich1,.fich2,toto,afich.
- touch fich11 fich12 ne sert à rien étant donné que fich11 et fich12 sont déjà présents dans rep1.
- Vérifiez l'arborescence en listant même les fichiers commençant par un point.
- Déplacez-vous dans rep1
- Copiez le contenu du fichier /etc/passwd dans le fichier fich11 du répertoire rep1. Calculer le nombre de ligne et de mo fichier fich11.
- Listez les fichiers de rep1 :
- dont les noms commencent par fich ,
- dont les noms commencent par fich suivi d'un seul caractère,
- dont les noms commencent par fich suivi d'un chiffre,
- dont les noms commencent par . ,
- dont les noms ne commencent pas par f,
- dont les noms contiennent fich.
- Comment déplacer toute l'arborescence rep3 sous le répertoire rep2 ? Supprimez tout sauf rep1, fich11 et fich12.
- Nous supposons que le propriétaire de rep1 à juste l'accès en écriture, le groupe et les autres n'ont aucun accès.
- Modifiez ces droits (avec deux méthodes) pour que tout le monde ait les accès en lecture, le propriétaire peut exécuter aussi, le groupe et les autres n'ont aucun autre accès que la lecture.
- Donnez la signification de ces nouveaux droits pour le propriétaire sur rep1.
- Le propriétaire dispose de permissions r-x sans w (écriture). Sur un répertoire, céla signifie que r: le propriétaire peut lister le contenu du fichier rep1, pas de w signifie que le propriétaire ne peut pas créer de nouveaux fichiers ou sous-répertoires ni en supprimer dans rep1. Et le permission x signifie que le propriétaire peut accéder rep1 (cd rep1) et le parcourir.
Correction
Correction
ls -a
Correction
cd rep1
Correction
# 2 méthodes pour copier le contenu de /etc/passwd dans fich11 cp /etc/passwd fich11 # Ou cat /etc/passwd >fich11 # Calculer le nombre de ligne wc -l fich11 # Calculer le nombre de mot wc -w fich11
Correction
# commencent par fich ls fich* # commencent par fich suivi d'un seul caractère ls fich? # commencent par fich suivi d'un chiffre ls fich[0-9] # commencent par . ls .* # ne commencent pas par f ls [!f]* # contiennent fich ls *fich*
Correction
mv rep3 rep2 rm -rf rep2 rmdir rep4 rep5
Correction
cd .. # Méthode 1 chmod u=r-x,g=r--,o=r-- rep1 # Méthode 2 chmod 544 rep1
Correction
Exercice 2: Shell Unix
- Écrivez un script permettant de compter le nombre de fichiers et la taille totale occupée pour
chaque type de fichier (répertoire, fichier ordinaire, fichier en mode bloc, ficher en mode
caractère) présent dans le répertoire courant. Les autres types de fichiers sont regroupés dans
la catégorie "misc.".
Exemple : - Ecrire un script shell qui permet de calculer la factorielle d'un nombre donné en paramétre.
- Ecrire un script shell nommé calculatrice qui prend trois arguments: l'opérande opérateur1 opérateur 2. Le shell doit calculer le résultat selon l'opérande (+, -, *, /) sur les deux opérateurs et l'affiche sur l'écran.
> ./info_size.sh Misc. : 13 fichiers, 1192201 octets fichiers en caractères : 8 fichiers, 1039377 octets fichiers en mode bloc : 7 fichiers, 5238 octets fichiers ordinaires : 5 fichiers, 2908 octets répertoires : 1 fichier, 110065 octets Total : 34 fichiers, 2349789 octets
Correction
#!/bin/bash # Compter le nombre de fichiers et leur taille dans la catégorie "Misc." MISC_COUNT=$(find . \( -type s -o -type l -o -type p \) | wc -l) MISC_TAILLE=$(find . \( -type s -o -type l -o -type p \) \ -exec du -cb {} + | tail -1 | awk '{print $1}') # Compter les fichiers en mode caractère CHAR_COUNT=$(find . -type c | wc -l) CHAR_TAILLE=$(find . -type c -exec du -cb {} + | tail -1 | awk '{print $1}') # Compter les fichiers en mode bloc BLOC_COUNT=$(find . -type b | wc -l) BLOC_TAILLE=$(find . -type b -exec du -cb {} + | tail -1 | awk '{print $1}') # Compter les fichiers ordinaires ORD_COUNT=$(find . -type f | wc -l) ORD_TAILLE=$(find . -type f -exec du -cb {} + | tail -1 | awk '{print $1}') # Compter les répertoires REP_COUNT=$(find . -type d | wc -l) REP_TAILLE=$(find . -type d -exec du -cb {} + | tail -1 | awk '{print $1}') # Afficher les résultats echo "Misc. : $MISC_COUNT fichiers, ${MISC_TAILLE:-0} octets" echo "fichiers en caractères : $CHAR_COUNT fichiers, ${CHAR_TAILLE:-0} octets" echo "fichiers en mode bloc : $BLOC_COUNT fichiers, ${BLOC_TAILLE:-0} octets" echo "fichiers ordinaires : $ORD_COUNT fichiers, ${ORD_TAILLE:-0} octets" echo "répertoires : $REP_COUNT fichiers, ${REP_TAILLE:-0} octets" echo "" # Afficher le total echo "Total : $(( MISC_COUNT + CHAR_COUNT + BLOC_COUNT + ORD_COUNT + REP_COUNT )) fichiers, \ $(( MISC_TAILLE + CHAR_TAILLE + BLOC_TAILLE + ORD_TAILLE + REP_TAILLE )) octets"
Correction
#!/bin/bash # Vérifier si un seul argument est fourni if [ $# -ne 1 ] then echo "ERREUR! Ce script doit être invoqué avec un seul argument" echo "Usage : ./factorielle [entier]" exit 1 else if [ $1 -eq 0 ] then echo 1 else echo $(( $1 * $( $0 $(( $1 - 1 )) ) )) fi fi
Correction
#!/bin/bash # Vérifier si exactement 3 arguments sont fournis if [ $# -ne 3 ] then echo "ERREUR! La commande doit être invoquée par 3 arguments!" echo "USAGE: ./calculatrice.sh [OPERATEUR] [OPERANDE 1] [OPERANDE 2]" exit 1 else echo $(( $2 $1 $3 )) fi