Vous êtes sur la page 1sur 103

RESUME LINUX

FILALI MOULAY RACHID

FILALI MOULAY RACHID

Page :

PARTIE I : COMMANDES LINUX A : RAPPEL


1.Grer fichiers et rpertoires
Crer un rpertoire (make directory): mkdir rp rm fichier1 fichier2 Crer des rpertoires imbriqus: Supprimer un rpertoire (remove dir): mkdir -p rp1/rp2 rmdir rp Changer de rpertoire (change dir): Supprimer un rpertoire non vide (force): cd nouveau_rp rm -rf rp cd .. (rpertoire parent) mv fichier_orig fichier_dest Supprimer (remove) des fichiers ou des liens:

2.Afficher les noms de fichiers


cd (rpertoire personnel) numrer (list) les fichiers ordinaires (ne cd ~alice (rpertoire personnel de alice) commenant pas par .) dans le rp. courant: Afficher rpertoire courant (print working dir) pwd Copier un fichier vers un autre: cp fichier_orig fichier_dest Copier des fichiers dans un rpertoire: cp fichier1 fichier2 rp Copier des rpertoires entiers (recursively): cp -r rp_orig rp_dest ls -t rsync -a rp_orig/ rp_dest/ Trier par taille (size) (d'abord les plus gros) Crer un lien symbolique: ls -S ln -s fichier_orig lien Renommer un fichier, lien ou rpertoire : Affichier en inversant (reverse) l'ordre de tri: ls Afficher une liste dtaille (long): ls -l numrer tous (all) les fichiers dans le rp. courant (y compris ceux commenant par .): ls -a Trier par date (time) (d'abord les plus rcents):

FILALI MOULAY RACHID

Page :

ls -r Afficher le contenu des fichiers Afficher bout bout le contenu de fichiers: cat fichier1 fichier2 (concatenate) Afficher le contenu de plusieurs fichiers (en faisant une pause chaque page): more fichier1 fichier2

Afficher toutes les lignes sauf celles qui contiennent une expression: grep -v expression fichier Recherche rcursive dans un rp.: grep -r expression rp Trier les lignes d'un fichier: sort fichier

less fichier1 fichier2 (plus de possibilits) Afficher les 10 premires lignes d'un fichier: head -10 fichier uniq -c (id. et compte chaque lment) Afficher les 10 dernires lignes d'un fichier: Trier, n'afficher qu'1 fois les lignes identiques: sort -u fichier (ou uniq)

5.Droits d'accs aux fichiers


tail -10 fichier Ajouter droits en criture au propritaire:

3.Modles de noms de fichiers


chmod u+w fichier (user, write) * .* tous les fichers tous les fichiers "cachs" Ajouter droits en lecture au groupe du fichier: chmod g+r fichier (group, read) Ajouter droits d'excution aux autres utilisat.: chmod o+x fichier caractre Ajouter droits lecture / criture tous (all):

*.log fichiers finissant par '.log' *bug* fichiers avec 'bug' dans leur nom *.? fichiers finissant par '.' et suivis d'un

4.Grer le contenu des fichiers


chmod a+rw fichier N'afficher que les lignes d'un fichier contenant une expression donne: chmod a+rX * grep expression fichier Rendre le rpertoire et tous les fichiers qu'il Recherche insensible aux majusc. / minusc.: contient accessibles par tous les utilisateurs: grep -i expression fichier FILALI MOULAY RACHID Page : 3 Rendre fich. excutables excutables par tous:

chmod -R a+rX rp (recursive) Changer le propritaire et le groupe d'un

Ajouter la sortie d'une commande un fichier: ls *.jpg >> fichiers_image

rpertoire et tout ce qu'il contient: Rediriger la sortie d'une commande vers chown -R nouvproprio:nouvgroupe rp l'entre d'une autre:

6.Comparer: fichiers, rpertoires


cat *.log | grep erreur Comparer 2 fichiers:

9.Contrle de tches
diff fichier1 fichier2 Afficher tous les processus excuts: Comparer 2 rpertoires: ps -ef diff -r rp1 rp2 Classement en direct des processus (P, M, T: trie par utilisation Proc, Mm ou Temps CPU): top Afficher la mmoire libre: free Afficher la mmoire virtuelle toutes les n secs: vmstat n Recherche rapide dans tout systme: (utilise un index, les fichiers rcents peuvent manquer): locate "*bar*" kill -9 <pid> Envoyer un signal d'arrt un processus: kill <pid> (numro indiqu par ps) Faire tuer un processus par le systme:

7.Rechercher des fichiers


Rechercher tous les fichiers dans le rpertoire courant (.) avec log dans leur nom: find . -name "*log*" Trouver tous les fichiers en .pdf dans rp et excuter une commande sur chacun: find . -name "*.pdf" -exec xpdf {} ';'

8.Rediriger sortie de commande


Rediriger sortie de commande vers un fichier: ls *.png > fichiers_image

Tuer tous processus que l'on a le droit de tuer: kill -9 -1 Tuer tous processus appels windows: killall windows

FILALI MOULAY RACHID

Page :

Tuer une application en mode graphique: xkill (cliquer sur la fentre du programme)

tar zcvf archive.tar.gz rp/ Tester (lister) une archive compresse: tar jtvf archive.tar.bz2 tar ztvf archive.tar.gz Extraire les fichiers d'une archive compresse: tar jxvf archive.tar.bz2

10. Taille de fichiers et partitions


Afficher l'espace total occup sur le disque par des fichiers ou des rpertoires (disk usage) du -sh rp1 rp2 fichier1 fichier2 Nombre de caractres, mots et lignes:

tar zxvf archive.tar.gz wc fichier (word count) Options de tar: Afficher la taille, le Type, l'espace total et c: crer l'espace libre dans la partition courante: t: tester / lister df -Th . x: extraire Afficher cette info pour toutes les partitions: df -Th j: (d)compression bzip2 la vole z: (d)compression gzip la vole Manipuler des archives zip: zip -r archive.zip <files> (crer) unzip -t archive.zip (tester / lister) unzip archive.zip (extraire)

11.Compresser
Compresser un fichier: bzip2 fichier (meilleur taux de compression) gzip fichier Dcompresser un fichier: bunzip2 fichier.bz2 gunzip fichier.gz

13.Imprimer
Envoyer fichiers PostScript ou texte sur queue: lpr -Pqueue f1.ps f2.txt (local printer) Lister les tches d'impression dans queue: lpq -Pqueue Annuler la tche n123 dans queue: cancel 123 queue Page : 5

12.Manipuler des archives


Crer une archive compresse (tape archive) tar jcvf archive.tar.bz2 rp/ (le mieux!)

FILALI MOULAY RACHID

lprm -Pqueue 123

Mesurer le temps pris par une commande: time trouve_prince_charmant -beau -ric he

14.Gestion des utilisateurs


Afficher les utilisateurs connects au systme: who Afficher sous quel utilisateur je suis connect: whoami Afficher quel groupe appartient utilisateur: groups utilisateur

16.Aide sur les commandes


Aide de base (pour la plupart des commandes): commande help (parfois '-h') Voir le manuel complet d'une commande: man grep help cd (commandes internes du shell)

17.Rseau
Passer l'utilisateur hulk: Vrifier l'tat d'un lien Ethernet: su - hulk ethtools <interface> Passer au super-utilisateur (root): su sudo -i su (sans changer de rp. ni d'environnement) Excuter une commande en tant que root: sudo commande Afficher toutes les interface rseau disponibles: ip link show Assigner une adresse IP une interface rseau: ip address add 207.46.130.108 dev eth0 Dsactiver une interface rseau: ip link set dev eth0 down Dfinir une passerelle par dfaut: ip route add default via 192.168.0.1 Supprimer la route par dfaut: ip route del default Tester la connexion rseau avec une machine: ping 207.46.130.108 FILALI MOULAY RACHID Page : 6

15.Grer le temps
Attendre 60 secondes: sleep 60 Afficher la date actuelle: date Mettre l'heure ntp : ntpdate time.nist.gov

18.Bases d'administration systme


Redmarrer la machine dans 5 minutes: shutdown -r +5 Eteindre la machine immdiatement: shutdown -h now (ou halt)

umount /mnt/cleusb Crr un volume RAID: mdadm -C /dev/md0 -l1 -n2 /dev/hda /dev/hdb Visualiser l'tat d'un volume RAID: mdadm -D /dev/md0 Marquer un disque comme dfaillant: mdadm /dev/md0 -f /dev/hda Sortir un disque du volume RAID: mdadm /dev/md0 -r /dev/hda Ajouter un disque dans un volume: mdadm /dev/md0 -a /dev/hda Prparer un volume physique pour LVM: pvcreate blockdev1 ... blockdevN Crer un volume group LVM: vgcreate monvg blockdev1 ... blockdevN Crer un volume logique LVM de 30Mb: lvcreate -n vol1 -L30M monvg Etendre un volume logique de 5Mb: lvextend -L5M /dev/mapper/monvg/vol1 Rduire un volume logique de 15Mb: lvreduce -L15M /dev/mapper/monvg/vol 1 Crer un volume TrueCrypt (fichier ou device): truecrypt -c

19.Gestion des filesystems


Crer ou supprimer des partitions sur le premier disque IDE: fdisk /dev/hda1 Crer (formater) un systme de fichiers ext3: mkfs.ext3 /dev/hda1 Crer (formater) un systme de fichiers FAT32: mkfs.vfat -v -F 32 /dev/hda2 Monter une partition formate: mkdir /mnt/cleusb (ncessaire une seule fois) mount /dev/uba1 /mnt/cleusb Monter image de systme de fichiers (loopback) mount -o loop initrd.img /mnt/initrd Utiliser un fichier comme un block device losetup /dev/loop0 fichier losetup -d /dev/loop0 (librer le device) Dmonter un systme de fichiers: FILALI MOULAY RACHID

Page :

(D)Monter un volume TrueCrypt: truecrypt volume /mnt/crypto (-d) Crer un volume luks: cryptsetup luksFormat /dev/ice Ouvrir un volume luks (monter ensuite crypdv): cryptsetup luksOpen /dev/ice cryptdv

[[:space:]] espace ou tabulation [[:lower:]] [a-z] ([[:upper:]] : [A-Z]) [[:print:]] caractre imprimable ou espace [[:xdigit:]] [A-Fa-f0-9]

21. Raccourcis bash


<ctrl-a> dbut de ligne <ctrl-e> fin (end) de ligne

20.Expressions rgulires
<ctrl-k> couper (kill) la fin de la ligne dans grep, vi, sed, ... les caractres ?, +, {, |, (, et ) doivent tre prcds d'un antislash (\) . n'importe quel caractre * caractre prcdent 0 fois ou + + caractre prcdent 1 fois au moins ? le caractre prcdent 0 ou 1 fois {n} le caractre prcdent n fois {m,n} le caractre prcdent de m n fois {n,} le caractre prcdent n fois ou plus [a-z] un caractre en minuscule [a-zA-Z] une lettre [0-9] un chiffre ^/$ le dbut/la fin de ligne | sparateur (ou logique) [[:alnum:]] [[:alpha:]] ou [[:digit:]] <ctrl-y> coller (yank) <ctrl-d> efface (delete) le caractre droit du curseur <esc>d efface le mot droite du curseur <ctrl-t> transposer deux caractres <esc>t transpose le mot prcdent et le suivant <ctrl-r> rechercher dans l'historique <ctrl-l> effacer l'cran (quivalent clear) <ctrl-d> envoie le caractre 'fin de fichier' <ctrl-c> arrter la commande en cours <ctrl-z> stopper la commande en cours <tab> complte l'lment <tab><tab>affiche les compltions possibles

22. Historique et job control bash


[[:digit:]] [0-9] !! r-excuter la dernire commande [[:alpha:]] [[:upper:]] ou [[:lower:]] !texte excuter la dernire commande FILALI MOULAY RACHID Page : 8

commenant par texte !n excuter la commande numro n cmd & excuter la commande cmd en arrire plan fg %n mettre le travail n en avant plan (sans argument : le dernier travail) bg %n mettre le travail n en arrire plan (sans argument : le dernier travail) kill %n terminer le travail n jobs affiche la liste des travaux du shell history affiche l'historique des commandes

Modes i (<ins>) mode insertion <esc> mode commande o ajouter une ligne aprs la ligne courante et passer en insersion Sortir , sauver :w sauver le fichier :w nom sauver dans le fichier nom :w>>nom sauver la fin du fichier nom :q quitter sans sauver :q! quitter de force sans sauver :x (:wq) sauver et quitter :e nom ferme le fichier courant et dite le fichier nom :e! nom ferme le fichier courant de force et dite le fichier nom :e! annule tous les changements et revient au fichier original Dplacements h dplacement vers la droite j dplacement vers le bas k dplacement vers le haut l dplacement vers la gauche ^^ dbut de ligne $ fin de ligne

23. Raccourcis less (ou man)


<espace> avance d'une page <return> avance d'une ligne n<return> avance de n lignes b recule (back) d'une page nb recule de n lignes q quitter less /texte rechercher la chaine texte n rechercher l'occurence suivante > va au dbut du fichier < va la fin du fichier v edite le fichier en cours !command excute command dans un shell

24. Editeur Vi
FILALI MOULAY RACHID

Page :

gg premire ligne (ou 1G) G dernire ligne nG ligne n (ou :n) w mot suivant b mot prcdent <ctrl-f> page suivante <ctrl-b> page prcdente fx aller aprs le prochain caractre x de la ligne tx aller avant le prochain caractre x de la ligne H aller en haut de l'cran M aller au milieu de l'cran

L aller en bas de l'cran Copier , couper , coller x coupe le caractre sous le curseur yy copie la ligne courante entire y^ copie la ligne du dbut au curseur y$ copie la ligne du curseur la fin yw copie le mot suivant dd coupe la ligne courante entire d^ coupe la ligne du dbut au curseur d$ coupe la ligne du curseur la fin dw coupe le mot suivant P colle avant la position courante p colle aprs la position courante

FILALI MOULAY RACHID

Page :

10

B : QUESTIONS /REPONSES : COMMANDES LINUX CP


Q1.Est-il possible de faire une copie d'un rpertoire et de l'ensemble de ses sous-rpertoires en une seule ligne de commande ? R1.Oui, c'est cela que sert l'option -r (recursive). Supposons, larborescence d'exemple

Que vous voulez copier le rpertoire Rapport et ses sous-rpertoires dans le rpertoire www. Il faut taper :
cp -r Rapport/ www/

ou
cp -R Rapport/ www/

Q2.Que se passe-t-il si l'on veut faire une copie appele tentative/ de son rpertoire essai/, et que le rpertoire tentative/ existe dj ? R2.Quand on indique le nom d'un rpertoire qui n'existe pas, cp considre qu'il s'agit du nom donner la copie du premier rpertoire (ou fichier). Quand le rpertoire existe dj, cp considre qu'il s'agit de l'endroit o il faut placer la copie du premier lment (la cible : target). Si donc on tape
cp -R essai/ tentative/

et que tentative/ existe dj, on obtient une copie de essai/, galement appele essai/, place dans le rpertoire tentative/. Q3.Que se passe-t-il si vous voulez faire une copie d'un fichier dans un rpertoire o il existe dj un fichier de ce nom ? R3.Le programme demande si vous voulez vraiment effacer le fichier dj existant pour le remplacer par celui dont vous faites la copie.

FILALI MOULAY RACHID

Page :

11

Attention ! Il en est ainsi parce que vous avez un alias de cp sur cp -i, qui demande confirmation. Ce n'est pas ncessairement le cas partout. Pour savoir quels sont vos alias, tapez alias ou allez voir dans votre fichier .alias. Avec la config conscrits, les alias sont dans le .zshrc (le fichier de configuration du shell zsh). Q4.Quel est l'effet d'une ligne comme :
cp fichier1 fichier2 fichier3 repertoire/

R4.Les fichiers fichier1, fichier2 et fichier3 sont copis sous leur nom dans le rpertoire rpertoire/, qui doit exister.

mv
Q5. Que se passe-t-il si le fichier cible existe dj ? R5. Si vous avez un alias de mv sur mv -i (cas de la config conscrits), le programme demande si vous voulez rcrire le fichier cible en remplaant son contenu par celui du fichier de dpart :
Rachid ~ $ ls rapport.tex notes complements Rachid ~ $mv notes complements mv: overwrite complements (yes/no)? y Rachid ~ $ls rapport.tex complements

Q6.Supposez que vous avez chez vous l'arborescence

Et que vous vous trouvez dans ~/Rapport/docs/. Q61. Comment faites-vous pour y amener Rapport.tex qui se trouve dans le rpertoire pre ?
R61. mv ../Rapport.tex .

Amener le fichier Rapport.tex situ dans rpertoire pre (../Rapport.tex) dans le rpertoire o on se trouve (. : ici). Q62. Comment faites-vous ensuite pour ramener ce fichier son emplacement d'origine ?
R62. mv Rapport.tex ..

FILALI MOULAY RACHID

Page :

12

Amener le fichier Rapport.tex situ dans le rpertoire courant, dans le rpertoire pre (..). Q7. Comment renommer un rpertoire bla/ en blo/ ? Que se passe-t-il si le rpertoire blo existe dj ? R7. Il suffit de taper
mv bla/ blo/

Si jamais blo/ existe dj, bla/ devient un sous-rpertoire de blo/. Q8. Comment faire pour la fois dplacer un fichier et changer son nom ? Que se passe-t-il si il existe dj un fichier de ce nom dans le rpertoire d'arrive ? R8. Supposons que l'on veut amener Rapport.tex dans le rpertoire courant, et l'appeler On tape :
mv ../Rapport.tex stage Rapport.tex est la fois dplac et renomm; vous pouvez vrifier qu'il n'est plus dans Rapport et qu'il y a dsormais un fichier stage dans docs/.

stage.

Si le fichier d'arrive existe dj, on se retrouve dans le cas vu tout au dbut de cet exercice (remplacement ou non). Q9. Mmes questions avec un rpertoire. R9. Pour dplacer et renommer, la syntaxe est la mme que pour un fichier :
mv ../bla ble/

dplace le rpertoire bla/ du rpertoire pre dans le rpertoire courant, et le renomme en ble/. Si jamais ble/ existe dj, bla/ y est dplac sous son nom, et devient un sous-rpertoire de ble/. Q10. Que se passe-t-il si on lance mv avec les options -i et -f ensemble ? . R10. L'option -f (force) sert renommer le fichier imprativement, mme si le fichier cible existe dj, sans demander confirmation. L'option -i (interactive) demande confirmation. Des deux options, c'est -f qui l'emporte :
Rachid ~ $ ls bla tutu Rapport/ Rachid ~ $ alias mv mv='mv -i' Rachid ~ $ mv bla tutu mv: overwrite tutu (yes/no)? n Rachid ~ $ mv -f bla tutu Rachid ~ $ ls tutu Rapport/

FILALI MOULAY RACHID

Page :

13

mkdir, rmdir
Q11. Crez trois rpertoires en une seule ligne de commande. R11. Si vous voulez crer trois rpertoires bla, ble et bli, tapez
mkdir bla ble bli

Q12. Effacez ces trois rpertoires en une seule ligne de commande. R12. Il faut taper
rmdir bla ble bli

Q13. Que se passe-t-il si vous tapez mkdir mkdir ? R13. Vous crez chez vous un rpertoire appel mkdir. Q14. Vous voulez dtruire un rpertoire bla/... mais a ne marche pas.
R14. ls vous dit qu'il est vide, et pourtant vous ne russissez pas l'effacer : c'est qu'il n'est pas vide. Il doit y avoir des fichiers cachs, commenant par un point, que vous ne voyez pas avec ls sans option. Il faut taper ls -a

et effacer les fichiers trouvs. Q15. Est-ce que mkdir peut prendre des options ? R15. Oui, une : l'option -p, dont on va parler tout de suite. Q16. quelle condition est-ce que la ligne de commande mkdir Rapport/annexes peut fonctionner et crer effectivement ce sous-rpertoire ? R16. Il faut que le rpertoire Rapport existe, pour que l'on puisse y crer un sous-rpertoire. Q17. Y a-t-il une option de mkdir qui permette de crer la fois un rpertoire et un sousrpertoire de ce rpertoire ? R17. Oui, c'est l'option -p. Quand vous tapez
mkdir -p Rapport/annexes

un rpertoire Rapport est cr, et dans ce rpertoire un sous-rpertoire annexes. Q18. Comment crer un rpertoire en spcifiant des droits ? R18. On utilise l'option -m (mode) de mkdir. Par exemple :

FILALI MOULAY RACHID

Page :

14

Rachid ~ $ mkdir -m 700 Mail Rachid ~ $ ls -ld Mail drwx-----2 robin litt95

2048 Jun

2 15:27 Mail/

Q19. Quel est l'effet de la commande suivante :


rmdir -p toto/tata/tutu/

R19. Cette commande efface toute la hirarchie des rpertoires, condition qu'ils soient vides; si par exemple tutu/ est vide mais toto/ ne l'est pas, tutu/ sera effac mais pas toto/, et le programme s'arrte. Q20. Cration rcursive sans message d'erreur R20. On achve avec ceci le tour de l'option -p... Si donc on tape
mkdir -p toto/tutu/

le sous-rpertoire tutu/ est cr si toto/ existe dj; et si toto/ n'existe pas, ce rpertoire et son sous-rpertoire sont crs. Il n'y a pas de message d'erreur.

cd
But de l'exercice : apprendre se servir de . et .. (point et point point). .. dsigne le rpertoire pre du rpertoire courant, et . dsigne le rpertoire courant. .. sert beaucoup avec cd, pour remonter d'un niveau dans une arborescence; . est trs utile avec des commandes comme mv ou cp, o il signifie en fait ici.

Q21. Dans quel rpertoire vous trouvez-vous quand vous vous loguez ? R21. Vous vous trouvez dans votre rpertoire personnel, dans ~ (tilde). Q22. Allez directement dans ~/Rapport/docs/afaire/ R22. Taper
cd Rapport/docs/afaire

Q23. De l, passez dans ~/Rapport/docs/fait/


R23. cd ../fait

Q24. Revenez dans ~/Rapport/ FILALI MOULAY RACHID Page : 15

R24. Taper
cd ../..

ou
cd ~/Rapport

Q25. Sans changer de rpertoire, regardez avec less le contenu de ~/www/index.html R25. Il faut taper
less ~/www/index.html

ou
less ../www/index.html

Q26. Passez dans ~/Rapport/docs/


R26. cd docs/

Q27. En restant l o vous tes, affichez les droits de ~/Mail/ R27. Il y a un petit pige dans cette question. En effet, si vous tapez
ls -l Mail/

vous allez obtenir le contenu du rpertoire Mail/, mais pas le statut du rpertoire luimme. Il faut donc utiliser l'option -d de ls :
Rachid ~ $ ls -ld Mail drwx------ 2 toto litt98 512 Apr 2 19:02 /users/98/litt/toto/Mail/

Q28. Revenez dans votre rpertoire principal R28. Taper cd, sans arguments. Q29. Que se passe-t-il si vous vous dloguez alors que vous n'tes pas dans votre rpertoire principal ? R29. Strictement rien ! a n'a aucune importance.

ls
Q30. Affichez le contenu de /usr/local/games/bin
R30. ls /usr/local/games/bin

Vous obtenez une liste des jeux installs.

FILALI MOULAY RACHID

Page :

16

Q31. Quelle est la taille de votre .flnewsrc.forum ?


R31. ls -al .flnewsrc.forum

L'option -a fait apparatre les fichiers de configuration, qui commencent par un point; l'option -l affiche plusieurs renseignements, en particulier la taille. En fait, si vous indiquez le nom complet du fichier cherch, avec le point, l'option -a est inutile; c'est le cas ici. Le .flnewsrc.forum contient la liste de continua de forum avec des indications sur les contis auxquels vous tes abonns et les messages que vous avez dj lus. Il est remis jour chaque fois que vous lisez forum : la date indique correspond donc la dernire fois que vous avec lanc (ou plus prcisment, quitt...) forum. Q32. quoi sert l'option -R de ls ? R32. Cette option permet d'afficher une liste rcursive, c'est--dire qui indique le contenu des rpertoires lists, ainsi que de leurs sous-rpertoires. Si vous tapez ls -R dans votre rpertoire personnel, vous aurez une liste de tout ce que vous avez chez vous. Q33. Dans quel ordre les fichiers et rpertoires sont-ils classs par dfaut? Quelles sont les options qui peuvent servir modifier ce critre de classement ? R33. Pour savoir cela, il faut chercher le mot sort dans le man de ls. La premire occurence vous dit que par dfaut le rsultat est tri par ordre alphabtique, selon la premire lettre des fichiers. De faon plus prcise, l'ordre est le suivant : ponctuations, chiffres, majuscules, minuscules, selon l'ordre dfini par la table des caractres ASCII. En continuant chercher, vous trouvez des options intressantes : -r (reverse), qui inverse l'ordre de classement, -t (time) qui trie en fonction de la date de dernire modification. Q34. Affichez le contenu de votre rpertoire courant de telle sorte que les fichiers modifis rcemment apparaissent en premier.
R34. ls -t

si vous voulez juste modifier le critre de tri, sans plus de renseignements; ou encore
ls -lt

si vous voulez une longue liste. Q35. Quels sont les droits de votre rpertoire Mail ? Qu'est-ce que cela signifie ? R35. La ligne ressemble ceci :
drwx------ 2 toto litt98 512 Apr 2 19:02 Mail

Le d indique qu'il s'agit d'un rpertoire (directory). Suivent ensuite neuf caractres, allant par trois; r, w, x correspondent aux droits que vous avez sur le rpertoire (ou le FILALI MOULAY RACHID Page : 17

fichier) : r (read) pour le droit de lecture, w (write) pour le droit d'criture, x (execute) pour le droit d'excution. Les six tirets qui suivent correspondent aux droits qu'ont le groupe (ici litt98) puis le reste des utilisateurs. Ici il y a des tirets, ce qui signifie qu'ils n'ont aucun droit sur ce rpertoire. Cela veut dire que seul le propritaire a le droit de lire et crire dans son rpertoire Mail/, ainsi que d'y accder. Les rpertoires et les fichiers de courrier sont protgs contre les indiscrtions. Un fichier de texte standard a les droits suivants :
-rw-r--r--

Il y a un tiret tout au dbut, ce qui signifie que c'est un fichier normal; vous avez le droit d'crire et de lire (rw-), votre groupe et les autres utilisateurs ont le droit de lire le fichier (r--). La commande chmod permet de changer ces droits, si l'on veut restreindre la lecture, ou rendre un fichier excutable. Remarque : ne cdez pas la paranoa... vos camarades ne passent pas leur temps farfouiller sur les comptes des voisins, donc vous n'avez pas besoin d'interdire la lecture tout ce que vous avez chez vous. Q36. Dcrivez le rsultat de la commande ls -l. R36.
o o -rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

Les dix premiers caractres dtaillent les droits du fichier. Le premier caratre identifie le type du fichier : ici, rien n'est spcifi, c'est donc un fichier normal. L'exercice prcdent dtaille la signification des lettres suivantes. Ce sont les droits normaux d'un fichier standard : tout le monde (propritaire, groupe et autres utilisateurs) peut lire le fichier, seul le propritaire peut crire dedans.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

o o o o o o o o o

Le chiffre indique le nombre de liens. Nous vous renvoyons aux exercices sur les liens pour plus d'explications (qui peuvent attendre un niveau dbutant...).
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

Le troisime champ donne le nom du propritaire du fichier. Ici, il s'agit de l'utilisateur robin.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

Ce champ indique le groupe de l'utilisateur. Ici, nous apprenons qu'milia est une littraire de la promotion 1995.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

Ce chiffre donne la taille en octets du fichier considr. Ici, le fichier fait 754 octets, soit moins d'un Ko (1000 octets). C'est un petit fichier.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux

Ce champ indique la date de dernire modification du fichier, ici le 22 mars de l'anne courante, 11h59. Quand le fichier date d'une anne antrieure, celle-ci est indique et l'heure ne figure plus. FILALI MOULAY RACHID Page : 18

-rw-r--r-- 1 robin

litt95

754 Mar 22 11:59 projet.aux

Vient enfin le nom du fichier. Le suffixe .aux montre qu'il s'agit d'un fichier produit par LaTeX lors de la compilation d'un fichier projet.tex. Q37. Comment afficher les droits d'un rpertoire donn ? R37. Si on tape
ls -l repertoire/

c'est le contenu du rpertoire qui s'affiche, et pas son statut lui. L'option -d (directory) permet de lister le rpertoire lui-mme. Q38. Caractres identifiant les fichiers ? R38. Ce sont les caractres suivants : slash (/) pour un rpertoire arobase (@) pour un lien symbolique toile (*) pour un excutable pipe (|) pour un pipe nomm gal (=) pour un socket C'est l'option -F qui permet de les afficher. Q39. Droits sur un rpertoire ? R39. Avoir le droit d'excuter un rpertoire, c'est avoir le droit d'y accder, de s'y dplacer; mais je n'ai pas le droit de lire son contenu. Donc, moins d'en tre propritaire, je ne peux pas afficher le contenu d'un rpertoire ayant comme droits :
drwx--x--x

Les droits
Q40. Changez les droits d'un fichier fic1 pour que tous ceux de votre groupe puissent crire dedans.
R40. chmod g+w fic1

Q41. Donnez en une seule ligne le droit d'excution tous les utilisateurs d'un fichier script qui n'a jusqu'alors que des droits standards (-rw-r--r--).
R41. chmod uog+x script

Q42. Le fichier toto a les droits suivants : -rwxr--r--. Modifiez-en les droits en une ligne de commande de sorte que le propritaire n'ait plus que le droit de lecture.

FILALI MOULAY RACHID

Page :

19

R42. chmod u-wx toto

Q43. Modifier les droits du fichier toto (-rwxr--r--) de sorte que le groupe et les autres utilisateurs aient les mmes droits que le propritaire.
R43. chmod og+wx toto

Q44. Quelle option permet de modifier rcursivement les droits d'un rpertoire et des fichiers qu'il contient ? R44. C'est l'option -R. Par exemple, pour interdire tous les droits aux fichiers prsents dans une branche du rpertoire confidentiel, on peut faire :
chmod -R og-rwx confidentiel

Q45. Quelle option de mkdir permet de crer un rpertoire en spcifiant les droits sur ce rpertoire ? R45. C'est l'option -m qui permet de le faire. Par exemple, pour crer un rpertoire en lecture interdite aux autres :
mkdir -m og-r repertoire

Q46. Affichez et interprtez les droits de /usr/sbin/mount.


R46 Rachid ~ $ ll /usr/sbin/mount -r-xr-xr-x 1 root bin 27208 Jan 9 2000 /usr/sbin/mount*

Il s'agit d'un fichier xcutable par tout utilisateur.

Les liens
Q47. Vous avez chez vous un rpertoire tmp/ qui contient un fichier bidon. Crez un lien physique sur tmp/bidon appel blo, dans votre rpertoire d'accueil (HOME). Comparez les contenus de tmp/bidon et de blo. Que contient blo ?
R47. ln tmp/bidon blo

Les contenus sont identiques. Les noms de fichiers tmp/bidon et blo renvoient au mme endroit sur le disque dur.

Q48. Mme question avec un lien symbolique.


R48. ln -s tmp/bidon blo

Le contenu semble tre identique, cependant, propos du blo, le disque dur ne contient comme information que le nom du fichier vers lequel le lien pointe (tmp/bidon).

Q49. Quelles sont les diffrences entre les liens durs et les liens symboliques ? FILALI MOULAY RACHID Page : 20

R49. On vient d'en voir une. On en dduit que le temps d'accs au contenu d'un lien dur est plus rapide que pour un lien symbolique. Une autre diffrence notable est que, contrairement aux liens symboliques, un lien dur ne peut pas pointer vers un rpertoire. Q49. Dans quel cas ne peut-on pas faire de lien physique ? Que faut-il faire ? R49. On ne peut pas faire de lien dur vers un rpertoire. Dans ce cas, il faut donc utiliser un lien symbolique. Q50. Quel est l'effet de chmod sur un lien ? R50. S'il s'agit d'un lien dur, les droits des deux fichiers lis sont modifis. En revanche, s'il s'agit d'un lien symbolique, les deux fichiers peuvent avoir des droits diffrents.

Les processus
Q51. Affichez la liste des processus associs votre terminal. Affichez la liste des processus dont vous tes propritaire. Recommencez en utilisant l'option -l. quoi correspondent les colonnes PID et PPID ? R51.
1. Rachid ~ $ ps 2. 3. 4. 5. PID 16970 16992 17382 TT pts/2 pts/2 pts/3 S S S R TIME 0:00 0:07 0:00 COMMAND /usr/local/util/bin/zsh4 vim systeme-sol.tml /usr/local/util/bin/zsh4

6. Rachid ~ $ ps -l

7. 8. 9. 10.

F 8 8 8

UID PID PPID %C PRI NI SZ RSS WCHAN S TT 9625 16970 16967 0 48 20 4032 3152 mutex_ex S pts/2 9625 16992 16970 1 58 20 4312 3760 mutex_ex S pts/2 9625 17382 17379 0 48 20 3912 2840 mutex_ex S pts/3

TIME 0:00 0:07 0:00

COMMAND /usr/local/u vim systeme/usr/local/u

Les numros apparaissant dans la colonne PID sont les numros des diffrents processus. Le PPID dsigne lui le numro du processus pre du processus en question. Par exemple, ici, le processus 16992 (vim) est un fils du processus 16970 (zsh). Q52. Lancez une commande longue en arrire plan. Quel est le comportement du processus associ lorsqu'il reoit les signaux suivants : R52. Pour envoyer un signal un processus, on peut faire :
Rachid ~ $ kill -23 17382

17382 dsignant un numro de processus (PID) et 23 le numro d'un signal (SIGSTOP).


o sigkill

(9) Page : 21

FILALI MOULAY RACHID

Le processus est tu sans pouvoir de dfendre.


o sigstop

(23)

Le processus s'interrompt.
o sigcont

(25)

Le processus interrompu redmarre. Q53. Utilisez la commande nice pour lancer des commandes ayant une faible priorit.
R53. Rachid ~ $ nice -19 ./calcul

Q54. Interprtez la hirarchie des processus qui vous appartiennent. R54. Pour vous aider comprendre, vous pouvez afficher un arbre en lanant la commande pstree (FreeBSD) ou ptree (Solaris). Q55. La commande ps | wc compte deux processus en plus de ceux qui existent rellement lorsqu'on lance la commande. Pourquoi ? R55. Ce sont les processus associs aux commandes ps et wc que vous venez de lancer ! Q56. Donner deux commandes pour reprendre l'excution d'une instruction interrompue par un ^Z. R56. Vous disposez des commandes fg et bg. fg permet de poursuivre le droulement du programme. bg le fait aussi mais il relance le programme en tche de fond.

Pipes, jokers et redirections cat


Q57. Comment visualiser deux fichiers l'un aprs l'autre l'aide de la commande cat ? R57. Il suffit de taper les deux noms de fichiers la suite; par exemple, pour visualier bla puis on tape :
cat bla blo

blo,

Q58. Comment faire une copie d'un fichier sans utiliser cp ni ouvrir d'diteur de texte ? R58. On demande cat d'afficher le contenu d'un fichier, puis de placer le rsultat dans un fichier :
cat toto > copie

Q59. Utiliser cat pour crire un peu de texte et mettre le rsultat dans un fichier notes. FILALI MOULAY RACHID Page : 22

R59. On demande cat de rediriger sa sortie dans un fichier, puis on n'a plus qu' taper le texte et indiquer la fin du texte avec ^D :
Rachid ~ $ ls maitrise.tex Rachid ~ $ cat > notes Faire la bibliographie Revoir le chapitre 1. ^D Rachid ~ $ ls maitrise.tex notes Rachid ~ $ cat notes Faire la bibliographie Revoir le chapitre 1. Rachid ~ $

C'est bien sr un moyen un peu spartiate pour crire du texte, mais dans le cas de choses trs courtes dans ce style, ce peut tre plus rapide que de lancer un vritable diteur. Q60. Quelle diffrence y a-t-il entre
cat bla blo > blu

et
cat bla blo >> blu

Que se passe-t-il, pour chaque ligne, selon que le fichier blu existe ou n'existe pas ?
cat bla blo > blu

R60. Concatne les deux fichiers bla et blo, et place le rsultat dans un nouveau fichier appel blu. Si blu existe dj, le shell affiche un message d'erreur et ne fait rien.
cat bla blo >> blu

place la concatnation de bla et blo la fin d'un fichier blu dj existant. S'il n'existe pas, le shell affiche un message d'erreur et en reste l, sans crer de fichier blu.

Les deux redirections ne sont donc pas du tout quivalentes, mais leur action dpend du shell, qui a des options qui modifie leur comportement par dfaut. Q61. Comment obtenir un fichier blo qui corresponde un fichier bla dont les lignes seraient dsormais numrotes ? R61. Il faut utiliser l'option -n de cat. Par exemple :
Rachid ~ $ cat bla Pomme Poire Prune Rachid ~ $ cat -n bla > blo Rachid ~ $ cat blo 1 Pomme 2 Poire

FILALI MOULAY RACHID

Page :

23

3 Prune Rachid ~ $

Jokers et expressions rgulires


Q62. Vous avez chez vous des fichiers appels essai1, essai2, essai3 et essai4. Comment les effacer en une seule ligne de commande ? R62. Il s'agit de donner le nom des fichiers en indiquant qu'ils commencent par essai et qu'ils finissent par un chiffre. Il y a en fait plusieurs faons de faire :
o o o rm essai[1234]

: les crochets signifient l'un des caractres qui se trouvent

entre crochets; : c'est le mme principe, sauf que l'on indique un intervalle au lieu d'crire explicitement les chiffres; rm essai? : le point d'interrogation dsigne n'importe quel caractre unique, le point y compris, sauf si le nom du fichier commence par un point (ls ?pine dans $HOME ne vous donnera pas, par exemple, la liste des fichiers de configuration de Pine : .pinerc, etc).
rm essai[1-4]

Ici, on trouvera tous les fichiers commenant par essai, suivi d'un unique caractre qui peut ne pas tre un chiffre.
o rm essai* : c'est la formulation la plus vague : effacer les fichiers dont le nom commence par essai suivi de quelque chose, c'est--dire d'un nombre indfini de caractres, ou aucun.

Q63. Dans mon rpertoire d'accueil, j'ai un certain nombre de fichiers avec un suffixe .c. Je dsire les regrouper dans un rpertoire que j'appelerai C/. Quelles sont les commandes que je dois taper ? R63. On commande par crer un rpertoire C avec mkdir, puis, avec mv, on dplace tous les fichiers ayant un suffixe . et dont le nom est fait d'une suite de caractres quelconques :
Rachid ~ hello* hello.c Rachid ~ Rachid ~ Rachid ~ C/ Rachid ~ hello.c $ ls zoinx* zoinx.c $ mkdir C $ mv *.c C/ $ ls hello* zoinx* $ ls C/ zoinx.c

Q64. Vous dsirez regrouper dans un rpertoire Rangement les fichiers dont le nom contient un caractre minuscule suivi d'un caractre majuscule. Quelle(s) est/sont la/les commande(s) donner ? R64. On commence par crer le rpertoire Rangement avec mkdir. Pour dsigner les noms des fichiers, il faut indiquer la notion de minuscule. On pourrait crire explicitement l'alphabet entre crochets, pour dire l'un de ces caractres, puis faire de mme avec les majuscules. Mais FILALI MOULAY RACHID Page : 24

on gagne du temps en utilisant des intervalles ([a-z] et [A-Z]). Le reste du nom du fichier, avant et aprs la minuscule puis la majuscule, est indfini. On crit donc :
Rachid ~ $ mkdir Rangement Rachid ~ $ mv *[a-z][A-Z]* Rangement/

Q65. Mme chose avec les fichiers dont le nom contient trois voyelles la suite. R65. Le principe est le mme, sauf que l'on indique explicitement les voyelles entre crochets :
Rachid ~ $ mkdir Rangement Rachid ~ $ mv *[aeiou][aeiou][aeiou]* Rangement/

Q66. En utilisant ls et grep, affichez la liste des fichiers dans /bin dont le nom correspond un motif donn. R66. On peut procder de deux faons : utiliser ls seul et des jokers, ou rediriger ls dans grep et utiliser les expressions rgulires de grep. !Attention ! Dans la suite, on suppose que l'on se trouve dj dans /bin/. On met des apostrophes autour des expressions de grep pour les protger contre le shell. Enfin, on ne dtaille pas les expressions rgulires; noter ces points importants propos de grep :
o o o o o

Le chapeau (^) en dbut d'expression dsigne le dbut de la ligne; Le dollar en fin d'expression dsigne la fin de la ligne; Le point dsigne n'importe quel caractre; L'toile signifie zro ou plus de fois le caractre qui prcde; c'est un multiplicateur; Comme avec les jokers du shell, [^m] veut dire sauf le caractre m.

On constate que grep est plus complexe mais bien plus puissant que les jokers du shell. Avec ls seul Commence par a et dont la deuxime lettre est s ou t Contient un et se termine par t Contient gre ou st Contient exactement deux lettres m Contient au moins deux lettres m Contient au moins quatre caractres et aucun chiffre Est constitu de deux lettres exactement Commence et finit par un chiffre
ls a[st]* ls *un*t ls *(gre|st)*

Avec ls et grep
ls | grep '^a[st].*' ls | grep '.*un.*t$' ls | grep '\(gre\|st\)' ls | grep '[^m]*m[^m]*m[^m]*' ls | grep '.*m.*m.*' ls | grep '^[^0-9]\{4,\}$'

ls ??

ls | grep '^..$'

ls [0-9]*[0-9] ls | grep '^[0-9].*[0-9]$'

FILALI MOULAY RACHID

Page :

25

Q67. Comment liminer les lignes vides dans un fichier ? Comment liminer les lignes ne contenant que des blancs ? Comment liminer toutes les lignes blanches ? R67. Une ligne vide est diffrente d'une ligne ne contenant que des blancs, c'est--dire des espaces ou des tabulations, mme si pour un oeil humain cela revient au mme. La commande de recherche sera diffrente selon le cas :
o

Lignes vides : c'est rien entre le dbut et la fin de la ligne; on crit donc :
grep '^$' fichier

Lignes ne contenant que des blancs : on utilise une classe de caractre prexistante : [:space:]. On crit donc :
grep '^[[:space:]]$' fichier

Pour liminer toutes les lignes blanches pour un oeil humain, on combine les deux expressions et on utilise l'option -v qui inverse le sens de la recherche. On n'a plus qu' rediriger la sortie dans un fichier. On crit donc :
grep -v '\(^[[:space:]]$\|^$\)' fichier1 > fichier2

en remplaant ventuellement le motif par '^$' ou ^[[:space:]]$' selon que l'on veut ter les lignes vides ou les lignes contenant des blancs.

head et tail
Q70. Affichez les 15 premires lignes du fichier /etc/hosts, les 15 dernires lignes, toutes les lignes partir de la quinzime, les lignes 15 20. R70. propos du fichier /etc/hosts : les ordinateurs sur l'Internet sont dsigns par une adresse IP, constitue de 4 nombres entre 0 et 255 spars par des points. C'est cette adresse IP qui permet un ordinateur d'envoyer un message (datagramme IP) un autre. Cependant, mmoriser les adresses IP n'est pas commode pour un humain. Pour cette raison, les ordinateurs ont aussi un nom, constitu d'un nombre variable de composantes spares par des points (par exemple, S9.ISTAG.AC.MA). Le mcanisme de conversion d'un nom en adresse IP (ou le mcanisme inverse) s'appelle la rsolution de noms. Elle se fait normalement par l'intermdiaire de nameservers, ordinateurs sur lequel tourne le programme BIND, qui se chargent de rpondre aux questions de rsolution de noms. Cependant, pour certaines machines trs communment accdes depuis un ordinateur donn (par exemple, les machines de la mme salle) ou bien pour viter d'avoir configurer un nameserver, on prfre parfois utiliser le fichier /etc/hosts : celui-ci dfinit un certain nombre de conversions nom -> adresse IP qui seront consultes avant les nameservers. La bibliothque qui se charge de faire la traduction, et qui consulte d'abord le /etc/hosts puis les nameservers, s'appelle la libresolv. FILALI MOULAY RACHID Page : 26

Afficher les 15 premires lignes de /etc/hosts :


head -15 /etc/hosts

Afficher les 15 dernires lignes de /etc/hosts :


tail -15 /etc/hosts

Afficher toutes les lignes partir de la quinzime :


tail +15 /etc/hosts

Affichez les lignes 15 20 :


head -20 /etc/hosts | tail -6

Q71. Rcuprer les lignes 5 9 d'un fichier de 12 lignes R71. Il y a deux solutions : Prendre les neuf premires lignes, et n'en garder que les cinq dernires (de 5 9 inclus) :
head -9 fichier | tail -5

Prendre les 8 dernires lignes (de 5 12 inclus) et n'en garder que les 5 premires :
tail -8 fichier | head -5

Q72. Comment afficher la cinquime ligne d'un fichier ? R72. On utilise la commande head pour extraire les cinq premires lignes du fichier, puis la commande tail pour ne conserver que la dernire des cinq :
head -5 fichier | tail -1

Filtres et redirections
Q73. Crez un fichier dont chaque ligne commence par un chiffre, suivi d'un slash (/), puis d'un ou plusieurs mots. R73. C'est la commande sort qui permet de trier des fichiers selon un ordre donn. ./TRI1A ./TRI1B ./TRI1C ./TRI1D ./TRI1E FILALI MOULAY RACHID Page : 27

Q74. Affichez les lignes de ce fichier tries en ordre croissant, suivant le nombre plac en dbut de ligne sans option trie automatiquement en fonction du premier caractre, par ordre alphabtique si c'est une lettre, par ordre croissant si ce sont des chiffres. Il suffit donc de taper :
R74. sort sort fichier

Q75. liminez de chaque ligne le chiffre et le caractre / . R75. Pour cela, sans utiliser d'diteur, on peut utiliser la commande cut, qui limine des champs dans une ligne. Par dfaut, le sparateur de champs est une tabulation. Ici, on peut demander cut de considrer le slash comme un sparateur de champs (option -d, dlimiteur), et de ne conserver que le deuxime champ du fichier (option -f, field). On redirige ensuite la sortie dans un autre fichier :
cut -d/ -f2 fichier > fichier2

Q76. Triez ces lignes par ordre alphabtique inverse. R76. C'est l'option -r (reverse) de sort qui inverse le rsultat de la comparaison. Par dfaut, sort trie par ordre alphabtique, il suffit donc de taper :
sort -r fichier2

Q77. Combien de fichiers de configuration avez-vous ? R77. La rponse n'est pas simple, car vous avez galement des rpertoires de configuration, comme .netscape/ qui contient entre autres vos marque-pages (bookmarks.html), vos prfrences (preferences), etc. On va compter le nombre de fichiers commenant par un point situs dans votre rpertoire principal, en liminant les copies de sauvegarde (qui finissent par un tilde). Il y a plusieurs manires de procder. A/ ls, grep, tr, cut On peut penser une solution complexe et bien lourde utilisant toutes ces commandes, ce qui permet de les apprendre plus qu'autre chose... On affiche une liste longue avec l'ensemble des fichiers (ls -la) puis qui limine tous les rpertoires et les liens avec grep en ne gardant que les lignes qui commencent par un tiret :
ls -al | grep '^-'

Ensuite, on utilise tr pour ne conserver qu'un seul espace entre chaque champ de la liste, en utilisant l'option -s (squeeze) qui remplace par une seule occurence la rptition d'un caractre spcifi; on met des apostrophes autour de l'espace pour qu'il soit compris comme tel et non comme un simple espace :
tr -s ' '

FILALI MOULAY RACHID

Page :

28

On utilise cut pour conserver le dernier champ avec les noms de fichiers (en l'occurence le neuvime champ), en indiquant que l'espace sert de dlimiteur de champ :
cut -d' ' -f9

Enfin, on demande grep de ne retenir que les fichiers commenant par un point, et ne finissant pas par un tilde, et on les comptel'option -c de grep. Cela donne pour finir :
ls -al | grep '^-' | tr -s ' ' | cut -d' ' -f 9 | grep -c '^\..*[^~]$'

Mais que de tourments pour si peu... :-) B/ ls et grep Il y a plus simple... On demande ls une liste des fichiers commenant par un point (avec l'option -d pour ne pas descendre dans les rpertoires de configuration), on ne garde que les lignes ne finissant pas par un / ou un tilde, et on compte :
ls -ad .* | grep -vc '\(~\|/\)$'

C/

find On demande find de chercher dans le rpertoire courant (.), sans descendre dans l'arborescence (-maxdepth 1), tous les fichiers normaux (-type f : file), dont le nom commence par un point (-name '.*'). On les compte ensuite avec wc :
find . -maxdepth 1 -name '.*' -type f | wc -l

Cette solution est prfrable car elle ne lance que deux processus et non pas au moins cinq comme la prcdente. Q78. Combien de rpertoires de configuration avez-vous ? R78. Il y a deux solutions, l'une faisant appel ls et grep, l'autre faisant appel find. 1. ls et grep Le principe est le mme que dans l'exercice prcdent. La diffrence est que grep va chercher les lignes qui commencent par un point et finissent par un slash. Cela se fait de la manire suivante :
grep '^\..*/$' .*

signifie n'importe quel caractre (point) rpt zro ou plusieurs fois (toile). On tape donc :

ls -ad .* | grep '^\..*/$' | wc -l

FILALI MOULAY RACHID

Page :

29

On part ici du principe que vous avez un alias de ls sur ls -F (qui met un slash aprs les noms de rpertoires, une toile aprs les noms d'excutables et une arobase aprs les noms de liens). Si ce n'est pas le cas, ajoutez-le dans un fichier .alias ou tapez ls -lF. 2. find On demande find de chercher tous les fichiers de type rpertoire (-type : directory), et dont le nom commence par un point (-name '.*', les quotes servant protger du shell le contenu de l'expression), dans descendre dans l'arborescence.
d

On tape donc :
find . -maxdepth 1 type d -name '.*' | wc -l

Il y a une inexactitude dans le rsultat : find compte aussi ./ dans le rsultat. Q79. Comment mettre dans un fichier la liste de tous les fichiers de l'arborescence partir du rpertoire courant ? R79. C'est l'option -R de ls qui permet d'afficher rcursivement le contenu d'un rpertoire et de ses sous-rpertoires ( ne pas confondre avec -r qui inverse le tri). Pour rediriger la sortie d'une commande dans un fichier, on utilise le caractre >. Pour mettre la liste de tous les fichiers de l'arborescence dans un fichier toto, il faut donc taper :
ls -R > toto

Q80. Crez un fichier liste contenant la liste de tous vos fichiers, avec leur taille, leurs droits, etc R80. Il va s'agir de faire une liste rcursive de l'ensemble de votre compte (option -R de ls), incluant les fichiers de configuration (option -a) et les renseignements donns par l'option -l. De la longue liste obtenue, on ne veut retenir que les fichiers, dont les droits commencent par un tiret (un d identifie les rpertoires). On va donc demander grep de chercher toutes les lignes commenant par un tiret. Enfin, on va placer le rsultat dans un fichier appel liste. On tape donc :
ls -alR | grep '^-' > liste

Q81. Comment afficher uniquement les fichiers du rpertoire courant qui sont des liens symboliques ? R81. L'option -l de ls donne une liste longue des fichiers, incluant les droits et le type des fichiers, identifis par une lettre : rien pour un fichier, d pour un rpertoire (directory), l pour un lien (link); par exemple :
drwxr-xr-x 2 emilia users 1024 mai 10 02:27 www/

FILALI MOULAY RACHID

Page :

30

Pour obtenir la liste des fichiers du rpertoire courant qui sont des liens symboliques, il suffit donc d'afficher cette liste longue et de ne retenir que les lignes qui commencent par un l, grce la commande grep. On utilise une expression rgulire pour cela : le chapeau (^) dsigne le dbut de la ligne, et l'ensemble de l'expression est place entre apostrophes pour qu'elle ne soit pas interprte par le shell. On tape donc :
ls -l | grep '^l'

Q82. Combien de lignes contiennent le mot file dans la page de man de less ? R82. Il faut lancer le man de less, et ensuite chercher dedans le nombre de lignes contenant le mot file (fichier en anglais), avec grep. C'est l'option -c (count) de grep qui va servir. Finalement, on crit :
man less | grep -c file

Et on obtient 205. C'est le nombre de lignes contenant au moins une fois la chane de caractres file, mais pas le nombre d'occurences du mot dans le fichier : il pourrait y avoir plusieurs fois file sur la mme ligne. On atteint l encore la limite de ce que sait faire grep. Q83. Quels sont les dix plus gros fichiers de /usr/bin/ ? R83. Il faut d'abord faire une liste des fichiers avec leurs tailles (option -l de ls. Ensuite, il faut trier ces lignes en fonction de la taille, avec la commande sort. Une ligne est de la forme suivante :
-rwxr-xr-x 1 root staff 5872 Jan 21 1994 /usr/bin/rm*

C'est le cinquime champ, celui de la taille, qui nous intresse. La numrotation commenant 0 (comme les tages), pour indiquer le cinquime champ on crit +4. Ensuite, on veut que le tri se fasse selon un critre numrique (option -n) et l'envers, en commenant par les plus grandes valeurs (option -r, reverse). Pour finir, on veut les dix premires lignes du rsultat. On les slectionne avec la commande head; par dfaut, elle prend les dix premires lignes d'un fichier, il n'est donc pas ncessaire de prciser le nombre de lignes voulues. Finalement, on crit :
ls -l /usr/bin | sort -nr +4 | head

Q84. Pour chaque ligne du fichier /etc/hosts, affichez :


o o o

Le cinquime caractre; Les caractres 5 10, et le treizime; Tous les caractres partir du quinzime.

R84. Une manire de rsoudre cet exercice consiste utiliser le programme sed qui sert manipuler du texte.

FILALI MOULAY RACHID

Page :

31

Nous allons utiliser la commande s de sed. Sa syntaxe est la


s/regexp/remplacement/

o regexp est une expression rgulire et remplacement une chane devant la remplacer.
o o

Pour afficher le cinquime caractre de chaque ligne, on peut faire ceci :


Rachid ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\).*/\1/"

Le "^.\{4\}" du dbut sert filtrer les 4 premiers caractres de chaque ligne. Ensuite, \(.\) filtre n'importe quel caractre, le fait de mettre des parenthses enregistre le caractre en question dans une variable que l'on peut utiliser dans la chane de remplacement avec "\1". Ensuite, .* filtre le reste de la ligne.
o o o o

Sur le mme principe, pour afficher les caractres 5 10 et le treizime :


Rachid ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\{6\}\)..\(.\).*/\1 \2/"

Et enfin, pour afficher tous les caractres partir du quinzime :


Rachid ~ $ cat /etc/hosts | sed -e "s/^.\{14\}//"

less
On aborde ici less, qui est une version plus labore de more; ce dernier est toujours dtaill dans dans les ouvrages sur Unix, et de fait il est toujours prsent sur ces systmes, ce qui n'est pas forcment vrai pour less (qui est quand mme trs courant). more est beaucoup plus rudimentaire, alors que less a beaucoup de fonctionnalits apprciables : vido inverse pour les motifs recherchs, dplacements en avant et en arrire pour la recherche, etc. Q85. Comment fait-on pour obtenir une page d'aide avec less ? R85. On tape h ou H pour afficher une page d'aide. On s'y dplace comme dans less (flches, ^D, ^F, ^B, ^P, SPC, j, k...). Pour quitter l'aide, ce sont les mmes commandes que pour quitter less : q, Q, :q, :Q, ZZ. Q86. Comment examiner plusieurs fichiers la suite ? Comment passe-t-on au suivant ? Comment revient-on au prcdent ? R86. Il suffit de donner plusieurs fichiers en argument la commande less; par exemple, pour examiner sucessivement les fichiers toto, bla et blu, on tape :
less toto bla blu

Pour passer au fichier suivant, on tape :n (next); pour revenir au fichier prcdent, on tape :p (previous). :x permet de revenir au premier fichier spcifi. Q87. Quelles sont les commandes diffrentes qui permettent de quitter less ? R87. Ce sont : q, Q, :q, :Q, ZZ. Q88. Comment dire less d'ouvrir le fichier en plaant en haut de l'cran la ligne n ? FILALI MOULAY RACHID Page : 32

R88. On spcifie le numro de la ligne aprs le signe +; par exemple, pour ouvrir le fichier rapport sur la ligne 57, on tape :
less +57 rapport

Q89. Comment dire less d'ouvrir le fichier en plaant en haut de l'cran la premire ligne o apparat un motif donn ? R89. On utilise l'option -p de la commande less; par exemple, pour chercher le mot toto dans le fichier rapport, on tape :
less -p toto rapport

On peut aussi indiquer le motif recherch de la faon suivante :


less +/toto rapport

Q90. Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement aprs et avant la position courante ? R90. Pour chercher un motif plus en avant dans le texte, on utilise le slash (barre oblique vers la droite : /). Par exemple :
/mot

Pour chercher en arrire de la position courante, on utilise le point d'interrogation. Pour aller la prochaine occurence du mot, il suffit de taper n (next). Pour aller la prcdente occurence du mot, il faut taper N. videmment, quand on cherche un motif avec ?, n remonte dans le texte et N descend dans le texte. Une fois le dbut ou la fin du fichier atteint, la recherche s'arrte. On peut utiliser les expressions rgulires. Q91. Comment dire less de chercher le mot partir de la premire ligne du fichier, et ce o que l'on soit dans le fichier ? R91. Il faut taper ^F aprs avoir tap /. En fait, ^F fait commencer la recherche au premier fichier dont on a donn le nom; quand il n'y en a qu'un seul, cela place de fait tout au dbut du fichier. Par exemple, pour chercher toto alors qu'on se trouve la fin du fichier, on tape :
/^F

Le prompt devient alors :


First-file /

et il n'y a plus qu' taper le motif recherch. Q92. Que se passe-t-il si l'on cherche le motif suivant : toTo en donnant l'option -i less ? Quelle option faut-il mettre la place de -i pour chercher toTo tout en ignorant la casse des caractres ? FILALI MOULAY RACHID Page : 33

R92. L'option -i signifie ignorecase, c'est--dire ignorer la casse des caractres (diffrence entre majuscules et minuscules). Si donc je tape (au choix) :
less less less less less -ip TOTO rapport -ip toto rapport -i +/toto rapport -i +/TOTO rapport

ne fera pas la diffrence entre les majuscules et les minuscules, et je trouverai toto comme TOTO. Bien sr, c'est la mme chose si je lance less avec l'option -i et que je cherche ensuite le mot l'intrieur du fichier avec / ou ?. Mais l'option -i est invalide si le motif recherch contient des majuscules et des minuscules : si, en lanant less comme ci-dessus, je cherche le motif Toto, je ne trouverai que Toto et pas TOTO par exemple. Pour contourner cette restriction, il faut lancer less avec l'option -I, qui est donc un ignorecase robuste. Q93. Quelles sont les commandes qui permettent d'aller la prochaine (resp. prcdente) occurence du motif recherch travers tous les fichiers dits ? R93. Pour aller l'occurence suivante (resp. prcdente) d'un motif dans un fichier, on utilise n (resp. N). Pour faire la mme opration mais sans passer manuellement de fichier en fichier, on tape ESC n pour chercher en avant, et ESC N pour chercher en arrire. ESC dsigne bien sr la touche d'chappement (Escape). Q94. Comment chercher dans un fichier le caractre / ? Le caractre / sert chercher un mot dans le fichier. Si on tape
//

rpond : Pattern not found. Il faut donc dire less de considrer le / comme un caractre ordinaire, et pas comme un caractre spcial. Comme avec toutes les expressions rgulires, c'est le backslash (barre oblique vers la gauche : \) qui sert cela. Pour chercher un /, on tape donc :
less /\/

La page de man donne une liste de caractres qui sont spciaux avec / et ?. Ces commandes de recherche utilisent les expressions rgulires de ed (et de vi par consquent).

find
Q95. Comment chercher tous les fichiers dont les noms commenent par un a majuscule ou une minuscule, suivi d'ventuellement quelques lettres ou chiffres, et se terminent par un chiffre entre 3 et 6 ? R95. C'est l'option -name qui permet de spcifier le nom du ou des fichiers recherchs. On peut indiquer le nom d'un fichier complet (bofichier.tex), ou utiliser des expressions rgulires (celles du shell, pas celles de grep...) : FILALI MOULAY RACHID Page : 34

o o o

L'toile (*) dsigne un ou plusieurs caractres; Le point d'interrogation remplace un (et un seul) caractre quelconque; Les crochets permettent de dsigner une srie de caractres au choix.

Dans notre cas, le premier caractre est un a ou un A ([aA]), suivi de quelque chose (*) et termin par un chiffre entre 3 et 6 ([3456] ou [3-6]). On crit donc :
find . -name '[aA]*[3-6]' -print

Q96. Comment fait-on pour indiquer que le fichier recherch a t modifi il y a plus de 30 jours ? Il y a 30 jours ? Il y a moins de 30 jours? R96. C'est l'option -mtime qui permet de donner une indication en jours. La syntaxe varie selon ce que l'on souhaite :
o o o -mtime 30 : le fichier a t modifi il y a 30 jours; -mtime +30 : le fichier a t modifi il y a 30 jours -mtime -30 : le fichier a t modifi il y a 30 jours

ou plus; ou moins.

Q97. Comment faire pour dire que le fichier a t modifi plus rcemment qu'un autre fichier donn ? R97. On utilise l'option -newer (plus rcent). Par exemple, on cherche un fichier .tex modifi plus rcemment que bofichier.tex :
find . -newer bofichier.tex -name '*.tex'

On peut raffiner la demande, en combinant cette option avec l'option -mtime : cherchons les fichiers modifis plus rcemment que bofichier.tex, mais il y a plus de 5 jours :
find . -newer bofichier.tex -mtime +5 -name '*.tex'

Q98. Comment fait-on pour spcifier que le fichier recherch est un rpertoire ? R98. On utilise l'option -type pour spcifier le genre de fichier recherch : les principaux sont f (file) pour un fichier normal, et d (directory) pour un rpertoire. On tape donc :
find . -type d

Q99. Comment indiquer que le fichier recherch une taille suprieure une taille donne ? R99. On utilise l'option -size, suivie d'un nombre et d'une lettre indiquant l'unit de mesure (c : octets, k : kilo-octets). Comme pour -mtime, on utilise +, - ou [rien] pour indiquer que la taille est, respectivement, suprieure, infrieure ou gale la valeur donne. Par exemple, on recherche un fichier modifi il y a moins de 12 jours et dont la taille soit suprieure 30 K :
find . -type f -size +30k -mtime -12 -print

FILALI MOULAY RACHID

Page :

35

commandes sur les fichiers


Q100. Utiliser find pour effacer tous vos fichiers de sauvegarde (termins par un tilde ~) qui ont plus d'un mois.

R100. La ligne utilise pour trouver ces fichiers et la suivante :


find . -mtime +30 -name '*~'

Il y a deux faons de faire excuter des commandes sur les fichiers trouvs par find : utiliser l'option -exec commande, ou utiliser un pipe avec xargs. 1. -execcommande excute la commande sur le fichier courant. La commande est termine par le marqueur ;, qu'il faut protger du shell avec un backslash. Le fichier courant est dsign par la chane {}. Pour effacer tous les fichiers de sauvegarde vieux de plus d'un mois, on tape donc :
find . -mtime +30 -name '*~' -print -exec rm \;

On peut faire excuter la commande de faon interactive en remplaant -exec par -ok :
find . -mtime +30 -name '*~' -print -ok rm \;

Le programme demande, pour chaque fichier trouv, si on veut bien excuter la commande; la rponse doit tre y ou Y . 2. La solution avec -exec est en fait trs lourde, car elle cre un nouveau processus pour chaque fichier; il vaut mieux rediriger le rsultat de find avec un pipe et xargs. Dans notre cas, on tapera donc :
3. find . mtime +30 -name '*~' | xargs -p rm

L'option -p de xargs rend cette commande interactive. Il faut rpondre y ou Y pour confirmer. Q101. Quelle diffrence y a-t-il entre un simple pipe et | xargs ? Pour la comprendre, voici un exercice : cherchez tous les fichiers contenus dans /usr/local/lib/texmf/tex et cherchez dedans le mot supertab. R101. Il y a deux solutions : 1. Vous tapez
find /usr/local/lib/texmf/tex -type f | grep supertab

Vous obtenez une liste de fichiers contenant supertab dans leur nom. 2. Vous tapez FILALI MOULAY RACHID Page : 36

find /usr/local/lib/texmf/tex -type f | xargs grep supertab

cherche dans chaque fichier pass en argument la chane de caractres supertab, ce qui est trs diffrent...
grep

grep
Q102. Quelles sont les options de grep qui permettent d'obtenir des lignes de contexte (qui prcdent et/ou suivent la ligne o figure le mot) ? R102. Il y en a plusieurs, qui se recoupent :
o -num

: le numro indique le nombre de lignes de contexte que l'on veut voir figurer avant et aprs la ligne o figure le mot recherch. Par exemple, si on veut trois lignes de contexte, avant et aprs la mot (soit sept lignes au total), on tape :

o o o o o o o o o

grep -3 ... -A num (after) : le numro

indique le nombre de lignes qui doivent suivre la ligne o figure le mot. Si on en veut quatre, on tapera :

indique le nombre de lignes qui doivent prcder la ligne o figure le mot. Si on en veut dix, on tape :
grep -B 10 ... -C (context), qui donne deux lignes de contexte avant et aprs. En fait, les trois lignes suivantes sont strictement quivalentes : grep -2 ... grep -C ... grep -A 2 -B 2 ...

grep -A 4 ... -B num (before) : le numro

Q103. Comment faire apparatre le numro de la ligne o figure le mot recherch ? R103. C'est l'option -n (number) qui sert cela; le numro figure tout au dbut de la ligne, suivi d'un deux-points (:) et du texte. Par exemple :
Rachid ~ $ grep -n violon verlaine.tex 12:des violons de l'automne

Q104. Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure d'abord, puis le numro de la ligne, et enfin le texte, le tout spar par des deux-points. Par exemple :
Rachid ~ $ grep -n violon * verlaine.tex:12:des violons de l'automne orchestre:45:Cordes : contrebasse, violoncelle, alto, violons.

Que se passe-t-il quand on demande galement des lignes de contexte ? R104. La disposition gnrale ne change pas, par contre, le signe utilis pour sparer la ligne de son numro est un tiret (-) quand il s'agit des lignes de contexte, et un deux-points quand il s'agit de la ligne voulue. Par exemple :
Rachid ~ $" grep -nC violon verlaine.tex 10-

FILALI MOULAY RACHID

Page :

37

11-Les sanglots longs 12:des violons de l'automne 13-bercent mon coeur 14-d'une langueur monotone

Q105. Comment faire pour afficher le nombre d'occurences du mot recherch ? R105. On utilise l'option -c (count) :
Rachid ~ $ grep -c violon * verlaine.tex:1 orchestre:1

Q106. Comment faire pour que grep ignore la casse des caractres (diffrence entre majuscules et minuscules) dans sa recherche ? R106. Par dfaut, grep fait la diffrence entre les majuscules et les minuscules; pour invalider ce comportement, on utilise l'option -i (ignorecase). Q107. Comment faire pour faire apparatre non pas les lignes o figurent le mot, mais les noms des fichiers ? R107. C'est l'option -l qui permet de faire cela : afficher les noms des fichiers o figure au moins une fois la chane de caractres recherche. Q108. Comment faire apparatre les lignes o ne figurent pas le mot recherch ? R108. On veut en fait inverser le sens de la recherche : c'est l'option -v qui fait cela. Q109. Comment faire apparatre les noms des fichiers ne contenant pas le mot recherch ? R109. On utilise l'option -L, qui affiche les noms de fichiers o ne figurent pas la chane de caractres recherche. Il ne faut bien sr pas confondre les options -l et -L... Q110. Comment faire pour que grep ne recherche que les lignes o figure le mot tel quel, et non pas ses variantes ? R110. C'est l'option -w (comme word) qui sert cela : un mot complet est dlimit comme suit :
o o

Dbut : la chane de caractres est place au dbut d'une ligne, ou prcde d'un blanc, d'une tabulation ou d'une ponctuation. Fin : la chane de caractre est place en fin de ligne, ou suivie d'un blanc, d'une tabulation ou d'une ponctuation.

Si donc on veut chercher travail et aucune forme drive de ce mot, on crit :


grep -w travail mon-fichier

Q111. Comment faire pour chercher plusieurs mots la fois en faisant apparatre les numros des lignes ? FILALI MOULAY RACHID Page : 38

R111. On veut chercher toutes les occurences des mots terre et ciel dans les deux premiers chapitres de la premire partie de Germinal, avec les numros des lignes. On propose deux solutions, la premire utilisant les ressources de la syntaxe de grep, la seconde utilisant l'option -f avec un fichier. Syntaxe de grep : La structure \(mot1\|mot2\) permet de chercher plusieurs mots. Ici, on tape la ligne suivante :
grep '\(ciel\|terre\)' fichier

On met des apostrophes de part et d'autre de l'expression pour la protger contre le shell, c'est-dire pour que le shell ne cherche pas interprter l'expression. Option -f fichier : dans un fichier quelconque, que nous appellerons liste, on indique les mots que l'on recherche : ciel et terre. Chaque ligne correspond un mot recherch. Il ne faut donc pas mettre de ligne comme
terre ciel

Car le programme chercherait la chane de caractres terre ciel, qui est assez improbable en franais. Il ne faut pas non plus laisser de ligne blanche : le programme afficherait l'ensemble du texte. Quelle que soit la solution retenue, on veut ensuite afficher le numro des lignes (option -n); d'autre part, pour que la recherche soit exhaustive, il vaut mieux que grep ne fasse pas de diffrence entre les majuscules et les minuscules, avec l'option -i (ignore case, ignorer la casse des caractres). Il faut aussi dcider si on cherche les mots tels quels, sans leurs variantes (comme terre au pluriel), ou si on accepte ces variantes. Si on ne veut que le mot sans ses drivs, on utilise l'option -w. Pour dsigner les deux fichiers o faire la recherche, on peut les crire littralement :
zola1.txt zola2.txt

ou, mieux, utiliser les joker du shell :


zola[12].txt [12]

signifie le caractre 1 ou le caractre 2.

Finalement, on peut taper, au choix :


grep grep grep grep -inw -inw -inw -inw -f liste zola1.txt zola2.txt -f liste zola[12].txt '\(ciel\|terre\)' zola1.txt zola2.txt '\(ciel\|terre\)' zola[12].txt

Et on obtient :
zola1.txt:13:ciel, le pav se droulait avec la rectitude d'une jete, au milieu de

FILALI MOULAY RACHID

Page :

39

zola1.txt:36:brlaient si haut dans le ciel mort, pareils des lunes fumeuses. Mais, au zola1.txt:50:besogne. Les ouvriers de la coupe terre avaient d travailler tar d, on zola1.txt:124:terre, lorsqu'un accs de toux annona le retour du charretier. Le ntement, zola1.txt:191:bleues en plein ciel, comme des torches gantes. C'tait d'une tristesse zola1.txt:207: Le manoeuvre, aprs avoir vid les berlines, s'tait assis terre, zola1.txt:222:fois avec tout le poil roussi, une autre avec de la terre jusque dans le (...)

Le rsultat est un peu diffrent quand on n'utilise pas l'option -w.

Expressions rgulires de grep


grep

recherche des chanes de caractres, qui peuvent tre un mot complet (terre), une suite de lettres (tre), ou une expression rgulire. Les expressions rgulires sont des formules qui reprsentent des chanes de caractres. On cherche alors non pas un mot prcis, mais des suites de caractres correspondant aux critres demands. Elles sont d'un usage frquent avec grep bien sr, mais aussi avec des commandes comme less, ou encore au sein d'un diteur.

Q112. Chercher toutes les lignes commenant par a ou A. R112. Il faut indiquer que l'on veut le dbut de la ligne, avec le chapeau (caret en anglais). Ensuite, on veut prciser que la ligne commence par un a minuscule ou majuscule. Il y a deux faons de le faire :
o o

Utiliser l'option -i qui fait ignorer la diffrence entre les majuscules et le minuscules. Dire que l'on cherche un a ou un A. C'est cela que servent les crochets : [abc] signifie a ou b ou c. Ici, ce sera [aA].

Enfin, il faut protger les signes contre le shell, pour qu'il ne les interprte pas; on met donc l'expression entre apostrophes. Remarque : la protection des expressions rgulires contre le shell est une question complexe.... Il faut donc crire :
grep -i '^a' fichier

ou
grep '^[aA]' fichier

FILALI MOULAY RACHID

Page :

40

Q113. Chercher toutes les lignes finissant par rs R113. C'est le dollar ($) qui reprsente la fin de la ligne. Il faut donc crire :
grep 'rs$' fichier

Q114. Chercher toutes les lignes contenant au moins un chiffre R114. Pour dsigner un chiffre, on peut en indiquer une liste entre crochets : [0123456789]. Il est plus simple d'utiliser une classe de caractres : [0-9] qui dsigne, comme la solution prcdente, n'importe quel chiffre de zro neuf. Il faut donc taper :
grep '[0-9]' fichier

Q115. Chercher toutes les lignes commenant par une majuscule R115. Comme on l'a vu, c'est le chapeau qui indique le dbut de la ligne. Pour indiquer que l'on cherche une majuscule, on peut soit en donner une liste ([ABCDEFGHIJKLMNOPQRSTUVWXYZ]), soit utiliser une classe de caractres : [A-Z], la seconde solution tant, de loin, prfrable... Il faut donc taper :
grep '^[A-Z]' fichier

Q116. Chercher toutes les lignes commenant par B, E ou Q R116. Il faut indiquer entre crochets les trois lettres recherches :
grep '^[BEQ]' fichier

Q117. Chercher toutes les lignes finissant par un point d'exclamation R117. Le point d'exclamation n'a pas de signification particulire avec grep, on peut donc le mettre tel quel :
grep '!$' fichier

Q118. Chercher toutes les lignes ne finissant pas par un signe de ponctuation (point, virgule, point-virgule, deux-points, point d'interrogation, point d'exclamation) R118. Il faut donner une liste de caractres, que l'on ne veut pas voir figurer; la liste sera entre crochets, comme on l'a dj vu, et c'est le chapeau qui signifiera, dans ce contexte, sauf. Par exemple, si on cherche tous les a, sauf ceux suivi de b, c ou t, on crit :
grep 'a[^bct]'

Il y a une seconde difficult, qui vient de ce que certains caractres sont spciaux avec grep. Vous vous doutez que le chapeau est spcial quand il est plac au dbut de l'expression, et que le dollar l'est quand il est plac en fin d'expression. Dans notre cas : FILALI MOULAY RACHID Page : 41

o o

Le point dsigne n'importe quel caractre. Le point d'interrogation signifie le caractre qui prcde apparat 0 ou 1 fois. Avec egrep, il fonctionne tout seul, avec grep, il faut le faire prcder d'un backslash pour qu'il fonctionne; par exemple (avec grep), pour chercher charbon ou vagabond, on crit :
grep 'ar?bo' fichier

(chercher la suite de lettre abo avec un r facultatif entre le a et le b). Pour que grep interprte littralement ces caractres, et ne les considre plus comme spciaux, il faut les faire prcder d'un backslash (\). Si par exemple vous cherchez toutes les lignes qui se terminent par un point, il faut taper :
grep '\.$' fichier

Dans notre cas cependant, ces caractres sont protgs par les crochets. On peut donc crire :
grep '[^.,;:?!]$' fichier

On peut aussi utiliser l'option -v, qui prend toutes les lignes o ne figure pas une chane de caractres donne; dans ce cas, on tape :
grep -v '[.,;:?!]$' fichier

Q119. Comment chercher tous les mots contenant un r prcd de n'importe quelle lettre majuscule ou minuscule ? R119. On cherche une chane de caractres qui soit indiffremment au dbut ou au milieu d'un mot. N'importe quelle lettre, ce sont les classes de caractres [a-zA-Z] ou [:alpha:], qui sont quivalentes. Il y a une petite subtilit avec l'emploi de classes du second type; elles dsignent un groupe de caractres, et il faut mettre une seconde paire de crochets pour dire n'importe quel caractre de cette classe prdfinie. On tape donc au choix :
grep '[a-zA-Z]r' fichier'

ou
grep '[[:alpha:]]r' fichier'

Attention, dans ces listes ne sont pas compris les caractres accentus... Q120. Chercher tous les mots dont la seconde lettre est un r. R120. C'est le symbole \< qui dsigne un dbut de mot. La premire lettre du mot est indiffrente, la seconde est un r. On crit donc :
grep '\<.r' fichier

FILALI MOULAY RACHID

Page :

42

Il y a cependant un problme avec les caractres accentus, que grep considre comme des blancs. Dans ce cas, il vaut mieux procder autrement : un mot est prcd d'un dbut de ligne, ou d'un blanc ou d'une tabulation. Un dbut de ligne, c'est le chapeau, un blanc ou une tabulation, c'est la classe de caractres [:space:]. On va se servir du pipe (|) qui signifie ou. Avec grep, il faut backslasher le pipe, avec egrep ce n'est pas ncessaire. On crit donc (avec grep) :
grep '^.r|[[:space:]].r' fichier

Ce n'est quand mme pas si simple; les mots peuvent tre prcds d'un tiret (mots composs), d'une apostrophe, de guillemets divers (``, ", , <<), et, si l'auteur du texte n'est pas respectueux des rgles de typographie, d'une ponctuation. Il y a donc bien des cas envisager...

Divers
Q121. Comment conserver les informations concernant le disque dans un fichier ? R121. C'est la commande df qui donne des informations sur le disque et sur les partitions montes. Pour rediriger la sortie d'une commande dans un fichier, on utilise l'oprateur de redirection > suivi du nom du fichier. Dans notre cas, pour conserver les informations dans un fichier appel disque, on crira :
df > disque

Q122. Comment connatre la dernire date de connexion au systme d'un utilisateur de login Bob ? R122. C'est la commande finger qui donne des renseignements sur les utilisateurs. Si on tape
finger Bob

ou mieux (plus rapide),


finger -m Bob

les renseignements concernant l'utilisateur s'affichent. On y trouve la date de son dernier login sur la machine o vous tes, ainsi que la date de la dernire fois o il a lu son courrier (mais ce condition qu'il ait reu du courrier depuis...). Q123. Affichez le type des fichiers /etc/passwd, /usr/include/stdio.h, /bin/ls et de votre rpertoire de travail. R123. C'est la commande file qui permet d'afficher le type des fichiers. Dans notre cas, il suffit d'crire:
Rachid ~ $ file /etc/passwd /usr/include/stdio.h /bin/ls . /etc/passwd: ASCII text /usr/include/stdio.h: C program text /bin/ls: ELF 32-bit MSB executable, SPARC, version 1, stripped .: directory Rachid ~ $

FILALI MOULAY RACHID

Page :

43

PARTIE II : Programmation Shell Bash


Introduction
Un script bash est une suite de commandes Linux, excutables. Pour ce faire, on dispose d'un langage de programmation interprt et complet, comprenant notamment : - la gestion des entres-sorties et de leur redirection - des variables dfinies par le programmeur et des variables systmes - le passage de paramtres - des structures conditionnelles et itratives - des fonctions internes. Par exemple, chaque changement de CD-ROM il faut : - dmonter lunit du lecteur de CD pour librer le CD, - remonter lunit umount /dev/cdrom mount t iso9660 /dev/cdrom /cdrom Un script intressant consisterait crer un fichier avec ces deux commandes. On aurait trs bien pu faire tout cela en crivant un programme en C par exemple. Le gros avantage des scripts shell, c'est que ce langage est totalement intgr Linux : il n'y a rien installer et rien compiler. Et surtout : vous avez trs peu de nouvelles choses apprendre. En effet, toutes les commandes que l'on utilise dans les scripts shells sont des commandes du systme que vous connaissez dj : ls, cut, grep, sort... I) Notre premier script

Un script est un fichier de type texte regroupant des commandes shell et excutable par l'interprteur bash, cest--dire par le programme /bin/bash. Pour le spcifier, trs souvent la premire ligne de commentaire dun script est #!/bin/bash Nous allons commencer par crire un premier script bash tout simple. Il ne sera pas rvolutionnaire, mais il va nous permettre de voir les bases de la cration d'un script et comment celui-ci s'excute. Cela vous sera donc essentiel pour la suite.

1) Cration du fichier

Commenons par crer un nouveau fichier pour notre script. Le plus simple est d'ouvrir vi en lui donnant le nom du nouveau fichier crer :
$ vi essai.sh

FILALI MOULAY RACHID

Page :

44

Si essai.sh n'existe pas, il sera cr (ce qui sera le cas ici). J'ai donn ici l'extension ".sh" mon fichier. On le fait souvent par convention pour indiquer que c'est un script shell, mais ce n'est pas une obligation. Certains scripts shell n'ont d'ailleurs pas d'extension du tout (j'aurais pu appeler mon script "essai" tout court donc).

2) Indiquer le nom du shell utilis par le script


La premire chose faire dans un script shell est d'indiquer... quel shell est utilis ( "sh", "bash", "ksh", etc.) En ce qui nous concerne, nous souhaitons utiliser la syntaxe de bash qui est le plus rpandu sous Linux et qui est plus complet que sh. Nous indiquons o se trouve le programme bash :

#!/bin/bash

Le #! est appel le sha-bang. /bin/bash peut tre remplac par /bin/sh si vous souhaitez coder pour sh, /bin/ksh pour ksh, etc. Bien que non indispensable, cette ligne permet de s'assurer que le script est bien excut avec le bon shell. En l'absence de cette ligne, c'est le shell de l'utilisateur qui sera charg. Cela pose un problme : si votre script est crit pour bash et que la personne qui l'excute utilise ksh, il y a de fortes chances que le script ne fonctionne pas correctement ! La ligne du sha-bang permet donc de "charger" le bon shell avant l'excution du script. Vous devrez la mettre au tout dbut de chacun de vos scripts partir de maintenant.

3) Excution de commandes

Aprs le sha-bang, nous pouvons commencer coder. Le principe est trs simple : il vous suffit d'crire les commandes que vous souhaitez excuter. Ce sont les mmes que celles que vous tapiez dans l'invite de commandes !

ls : pour lister les fichiers du rpertoire cd : pour changer de rpertoire mkdir : pour crer un rpertoire grep : pour rechercher un mot sort : pour trier des mots etc. Page : 45

FILALI MOULAY RACHID

Exemple : #!/bin/bash # script bonjour # il affiche un salut l'utilisateur qui a lanc ce script # la variable d'environnement $USER contient le nom de login echo ---- Bonjour $USER ----# l'option -n empeche le passage la ligne # le ; sert de sparateur entre deux commandes echo -n "Nous sommes le " ; date # recherche de $USER en dbut de ligne dans le fichier passwd # puis extraction de l'uid au 3me champ, et affichage echo "Ton numro d'utilisateur est" `grep $USER /etc/passwd | cut -f 3 -d:`

4) Les commentaires
Notez que vous pouvez aussi ajouter des commentaires dans votre script. Les commentaires sont des lignes qui ne seront pas excutes mais qui permettent d'expliquer ce que fait votre script. Tous les commentaires commencent par un #. Par exemple :
1 #!/bin/bash 2 3 # Affichage de la liste des fichiers 4 Ls

RQ !! : La ligne du sha-bang commence aussi par un #... C'est un commentaire ? Oui, c'est un commentaire aussi, mais considrez que c'est un commentaire "spcial" !! .

II) Excuter le script bash 1) Donner les droits d'excution au script


Pour excuter un script, il faut que le fichier ait le droit "excutable". Le plus simple pour donner ce droit est d'crire :
$ chmod +x essai.sh

2) Excution du script
Le script s'excute maintenant comme n'importe quel programme, en tapant "./" devant le nom FILALI MOULAY RACHID Page : 46

du script :
$ ./essai.sh

Vous pouvez modifier votre script pour qu'il vous donne auparavant aussi le nom du rpertoire dans lequel vous vous trouvez :
1 #!/bin/bash 2 3 pwd 4 ls

Les commandes seront excutes l'une aprs l'autre :

3) Excution de dbuggage
Vous ferez probablement de gros scripts et vous risquez de rencontrer des bugs. Il faut donc ds prsent que vous sachiez comment dbugger un script. Il faut l'excuter comme ceci :
$ bash -x essai.sh

On appelle en fait directement le programme bash et on lui ajoute en paramtre un -x (pour lancer le mode dbuggage) et le nom de notre script dbugger. Le shell affiche alors le dtail de l'excution de votre script, ce qui peut vous aider retrouver la cause de vos erreurs :

4) Crer sa propre commande


Actuellement, le script doit tre lanc via ./essai.sh et vous devez tre dans le bon rpertoire (ou alors vous devez taper le chemin en entier, comme /home/Formateur/scripts/essai.sh). Comment font les autres programmes pour pouvoir tre excuts depuis n'importe quel rpertoire sans "./" devant ? Il vous suffit donc de dplacer ou copier votre script dans un de ces rpertoires, comme /bin, ou /usr/bin, ou /usr/local/bin (ou un autre rpertoire du PATH). Notez qu'il faut tre root pour pouvoir faire a. Une fois que c'est fait, vous pourrez alors taper simplement essai.sh pour excuter votre programme, et ce quel que soit le rpertoire dans lequel vous vous trouvez !

FILALI MOULAY RACHID

Page :

47

$ essai.sh

III)

Dclarer une variable

1) variables
Nous allons crer un nouveau script que nous appellerons variables.sh :
$ vim variables.sh

La premire ligne de tous nos scripts doit indiquer quel shell est utilis, comme nous l'avons appris tout l'heure. Commencez donc par crire :
1 #!/bin/bash

Cela indique que nous allons programmer en bash. Maintenant, dfinissons une variable. Toute variable a un nom et une valeur :
1 message='Bonjour tout le monde'

Dans le cas prsent :


La variable a pour nom message ... et pour valeur 'Bonjour tout le monde'

RQ !!: Ne mettez pas d'espaces autour du symbole gal "=" ! Si vous voulez insrer une apostrophe dans la valeur de la variable, il faut la faire prcder d'un antislash \. En effet, comme les apostrophes servent dlimiter le contenu, on est oblig d'utiliser un caractre dchappement pour pouvoir vraiment insrer une apostrophe :
1 message='Bonjour c\'est moi'

Bien, reprenons notre script. Il devrait maintenant ressembler cela :


1 #!/bin/bash 2 3 message='Bonjour tout le monde'

2) echo : afficher une variable


$ echo Salut tout le monde Salut tout le monde

FILALI MOULAY RACHID

Page :

48

En fait, la commande echo affiche dans la console tous les paramtres qu'elle reoit. Ici, on a envoy 4 paramtres :

Salut tout le monde

Chacun des mots tait considr comme un paramtre que echo a affich. Si vous mettez des guillemets autour de votre message, celui-ci sera considr comme un seul paramtre (le rsultat sera visuellement le mme) :
$ echo "Salut tout le monde" Salut tout le monde

Si vous voulez insrer des retours la ligne, il faudra activer le paramtre -e et utiliser le symbole \n :
$ echo -e "Message\nAutre ligne" Message Autre ligne

3) Afficher une variable


Pour afficher une variable, on va rutiliser son nom prcd du symbole dollar "$" :
1 #!/bin/bash 2 3 message='Bonjour tout le monde' 4 echo $message

Comparez les lignes 3 et 4 : lorsqu'on dclare la variable la ligne 3, on ne doit pas mettre de $ devant. En revanche, lorsqu'on l'affiche la ligne 4, on doit cette fois mettre un $ ! Rsultat :
Bonjour tout le monde

Maintenant, supposons que l'on veuille afficher du texte et la variable la fois. On serait tent d'crire :
1 #!/bin/bash 2 3 message='Bonjour tout le monde' 4 echo 'Le message est : $message'

FILALI MOULAY RACHID

Page :

49

Problme, a ne marche pas comme on veut car a affiche :


Le message est : $message

Pour bien comprendre ce qui se passe, intressons-nous au fonctionnement de ce qu'on appelle les "quotes".

4) Les quotes
Il est possible d'utiliser des quotes pour dlimiter un paramtre qui contient des espaces. Il existe 3 types de quotes :

Les apostrophes ' ' (simples quotes) Les guillemets " " (doubles quotes) Les accents graves ` ` (back quotes), qui s'insrent avec Alt Gr + 7 sur un clavier AZERTY franais

Selon le type de quote que vous utilisez, la raction de Bash ne sera pas la mme.

a) Les simples quotes ' '


Commenons par les simples quotes :
1 message='Bonjour tout le monde' 2 echo 'Le message est : $message' Le message est : $message

Avec des simples quotes, la variable n'est pas analyse et le $ est affich tel quel.

b) Les doubles quotes " "


Avec des doubles quotes :
1 message='Bonjour tout le monde' 2 echo "Le message est : $message" Le message est : Bonjour tout le monde

la variable est analyse et son contenu est affich. En fait, les doubles quotes demandent bash d'analyser le contenu du message. S'il trouve des symboles spciaux (comme des variables), il les interprte. Avec des simples quotes, le contenu tait affich tel quel. FILALI MOULAY RACHID Page : 50

c) Les back quotes ` `


Un peu particulires, les back quotes demandent bash d'excuter ce qui se trouve l'intrieur.
1 message=`pwd` 2 echo "Vous tes dans le dossier $message" Vous tes dans le dossier /home/Formateur/bin

La commande pwd a t excute, et son contenu a t insr dans la variable message ! On a ensuite affich le contenu de la variable.

IV) read : demander une saisie


Vous pouvez demander l'utilisateur de saisir du texte avec la commande read. Ce texte sera immdiatement stock dans une variable. La commande read propose plusieurs options intressantes. La faon la plus simple de l'utiliser est d'indiquer le nom de la variable dans laquelle le message saisi sera stock :
1 read nomvariable

Adaptons notre script pour qu'il nous demande notre nom et nous l'affiche :
1 #!/bin/bash 2 3 read nom 4 echo "Bonjour $nom !"

Lorsque vous lancez ce script, rien ne s'affiche, mais vous pouvez taper du texte (votre nom par exemple.
Formateur Bonjour Formateur !

1) Affecter simultanment une valeur plusieurs variables


On peut demander de saisir autant de variables d'affile que l'on souhaite. Voici un exemple de ce qu'il est possible de faire :
1 #!/bin/bash 2 3 read nom prenom 4 echo "Bonjour $nom $prenom !"

FILALI MOULAY RACHID

Page :

51

TRI-1 TRI-2 Bonjour TRI-1 TRI-2!

read lit ce que vous tapez mot par mot (en considrant que les mots sont spars par des espaces. Il assigne chaque mot une variable diffrente, d'o le fait que le nom et le prnom ont t correctement assigns $nom et $prenom respectivement. Si vous rentrez plus de mots au clavier que vous n'avez prvu de variables pour en stocker, la dernire variable de la liste rcuprera tous les mots restants. En clair, si j'avais tap pour le programme prcdent " TRI-1 TRI-2 TRI-3", la variable $prenom aurait eu pour valeur " TRI-2 TRI-3 ".

2) read -p : afficher un message de prompt


Notre programme n'est pas trs clair, on devrait afficher un message pour que l'utilisateur sache quoi faire. Avec l'option -p de read, vous pouvez faire cela :
1 #!/bin/bash 2 3 read -p 'Entrez votre nom : ' nom 4 echo "Bonjour $nom !"

Notez que le message 'Entrez votre nom' a t entour de quotes. Si on ne l'avait pas fait, le bash aurait considr que chaque mot tait un paramtre diffrent ! Rsultat :
Entrez votre nom : Formateur Bonjour Formateur !

3) read -n : limiter le nombre de caractres


Avec -n, vous pouvez couper au besoin au bout de X caractres si vous ne voulez pas que l'utilisateur rentre un message trop long. Exemple :
1 #!/bin/bash 2 3 read -p 'Entrez votre login (5 caractres max) : ' -n 5 nom 4 echo "Bonjour $nom !"

Entrez votre login (5 caractres max) : FormaBonjour Forma !

Notez que le bash coupe automatiquement au bout de 5 caractres, sans que vous ayez besoin d'appuyer sur la touche Entre. Ce n'est pas trs esthtique du coup, parce que le message FILALI MOULAY RACHID Page : 52

s'affiche sur la mme ligne. Pour viter cela, vous pouvez faire un echo avec des \n comme vous avez appris le faire plus tt :
1 #!/bin/bash 2 3 read -p 'Entrez votre login (5 caractres max) : ' -n 5 nom 4 echo -e "\nBonjour $nom !"

Entrez votre login (5 caractres max) : Forma Bonjour Forma !

4) read -t : limiter le temps autoris pour saisir un message


Vous pouvez dfinir un "timeout" avec -t, c'est--dire un nombre de secondes au bout desquelles le read s'arrtera.
#!/bin/bash 1 2 read -p 'Entrez le code de dsamorage de la bombe (vous avez 5 secondes) : 3 ' -t 5 code 4 echo -e "\nBoum !"

5) read -s : ne pas afficher le texte saisi


Plus utile probablement, le paramtre -s masque les caractres que vous saisissez. Cela vous servira notamment si vous voulez que l'utilisateur rentre un mot de passe :
#!/bin/bash 1 2 read -p 'Entrez votre mot de passe : ' -s pass 3 echo -e "\nMerci ! Je vais dire tout le monde que votre mot de passe est 4 $pass ! " Entrez votre mot de passe : Merci ! Je vais dire tout le monde que votre mot de passe est secret82 !

V) Effectuer des oprations mathmatiques


En bash, les variables sont toutes des chanes de caractres. En soi, le bash n'est donc pas vraiment capable de manipuler des nombres, et donc il n'est pas capable d'effectuer des oprations. Heureusement, on peut passer par des commandes. let
1 let "a = 5" 2 let "b = 2" 3 let "c = a + b"

FILALI MOULAY RACHID

Page :

53

A la fin de ce script, la variable $c vaudra 7.


1 2 3 4 5 6 #!/bin/bash let "a = 5" let "b = 2" let "c = a + b" echo $c

Les oprations utilisables sont :


L'addition : + La soustraction : La multiplication : * La division : / La puissance : ** Le modulo : % (renvoie le reste de la division)

Quelques exemples :
1 2 3 4 5 let let let let let "a "a "a "a "a = = = = = 5 * 3" # $a = 15 4 ** 2" # $a = 16 (4 au carr) 8 / 2" # $a = 4 10 / 3" # $a = 3 10 % 3" # $a = 1

Explication pour les 2 dernires lignes :


10 / 3 = 3 car la division est entire (la commande ne renvoie pas de nombres dcimaux) 10 % 3 renvoie 1 car le reste de la division de 10 par 3 est 1. En effet, 3 "rentre" 3 fois dans 10 (a fait 9), et il reste 1 pour aller 10.

Notez qu'il est possible aussi de contracter les commandes, comme cela se fait en langage C. Ainsi :
1 let "a = a * 3"

... est quivalent crire :


1 let "a *= 3"

FILALI MOULAY RACHID

Page :

54

VI) Les variables d'environnement


Actuellement, les variables que vous crez dans vos scripts bash n'existent que dans ces scripts. En clair, une variable dfinie dans un programme A ne sera pas utilisable dans un programme B. Les variables d'environnement sont des variables que l'on peut utiliser dans n'importe quel programme. On parle aussi parfois de variables globales. Vous pouvez afficher toutes celles que vous avez actuellement en mmoire avec la commande env : Il y en a beaucoup. Certaines sont trs utiles, d'autres moins.

SHELL : indique quel type de shell est en cours d'utilisation (sh, bash, ksh...) PATH : une liste des rpertoires qui contiennent des excutables que vous souhaitez pouvoir lancer sans indiquer leur rpertoire. On en a parl un peu plus tt. Si un programme se trouve dans un de ces dossiers, vous pourrez l'invoquer quel que soit le dossier o vous vous trouvez. EDITOR : l'diteur de texte par dfaut qui s'ouvre lorsque cela est ncessaire. HOME : la position de votre dossier home. PWD : le dossier dans lequel vous vous trouvez. OLDPWD : le dossier dans lequel vous vous trouviez auparavant.

Notez que les noms de ces variables sont, par convention, crits en majuscules. Comment utiliser ces variables dans vos scripts ? C'est trs simple, il suffit de les appeler par leur nom ! Exemple :
1 #!/bin/bash 2 3 echo "Votre diteur par dfaut est $EDITOR"

Plus rarement, vous pourriez avoir besoin de dfinir votre propre variable d'environnement. Pour cela, on utilise la commande export

VII) Les variables des paramtres


Comme toutes les commandes, vos scripts bash peuvent eux aussi accepter des paramtres. Ainsi, on pourrait appeler notre script comme ceci :
./variables.sh param1 param2 param3

Le problme, c'est que nous n'avons toujours pas vu comment rcuprer ces paramtres dans notre script. Pourtant, c'est trs simple faire ! En effet, des variables sont automatiquement cres :

$# : contient le nombre de paramtres $0 : contient le nom du script excut (ici "./variables.sh") Page : 55

FILALI MOULAY RACHID

$1 : contient le premier paramtre $2 : contient le second paramtre ... $9 : contient le 9me paramtre

Essayons :
1 #!/bin/bash 2 3 echo "Vous avez lanc $0, il y a $# paramtres" 4 echo "Le paramtre 1 est $1" $ ./variables.sh param1 param2 param3 Vous avez lanc ./variables.sh, il y a 3 paramtres Le paramtre 1 est param1

On peut imaginer un script qui accepte une liste de fichiers en paramtres. Rien ne nous empcherait de lui envoyer 15 paramtres dans ce cas :
./script.sh fichier1 fichier2 fichier3 fichier4 ... fichier14 fichier15

Pour traiter autant de paramtres plus que 9, on les fera en gnral un par un.. On peut "dcaler" les paramtres dans les variables $1 $2 etc. avec la commande shift.
1 2 3 4 5 #!/bin/bash echo "Le paramtre 1 est $1" shift echo "Le paramtre 1 est maintenant $1"

$ ./variables.sh param1 param2 param3 Le paramtre 1 est param1 Le paramtre 1 est maintenant param2

Comme vous le voyez, les paramtres ont t dcals : $1 correspond aprs le shift au second paramtre, $2 au troisime paramtre, etc. Bien sr, shift est gnralement utilis dans une boucle qui permet de traiter les paramtres un par un.

VIII) Les tableaux


Le bash gre aussi les variables "tableaux". Ce sont des variables qui contiennent plusieurs cases, comme un tableau. Vous en aurez probablement besoin un jour, voyons comment cela fonctionne. Pour dfinir un tableau, on peut faire comme ceci :
1 tableau=('valeur0' 'valeur1' 'valeur2')

FILALI MOULAY RACHID

Page :

56

Cela cre une variable tableau qui contient 3 valeurs (valeur0, valeur1, valeur2). Pour accder une case du tableau, on doit utiliser la syntaxe suivante :
1 ${tableau[2]}

... ceci affichera le contenu de la case n2 (donc "valeur2"). Les cases sont numrotes partir de 0 ! La premire case a donc le numro 0. Notez par ailleurs que pour afficher le contenu d'une case du tableau, vous devez entourer votre variable daccolades ${tableau[2]}. Vous pouvez aussi manuellement dfinir le contenu d'une case :
1 tableau[2]='valeur2'

Essayons tout ceci dans un script :


1 2 3 4 5 #!/bin/bash tableau=('valeur0' 'valeur1' 'valeur2') tableau[5]='valeur5' echo ${tableau[1]}

Rponse :
valeur1

Comme vous pouvez le constater, le tableau peut avoir autant de cases que vous le dsirez. La numrotation n'a pas besoin d'tre continue, vous pouvez sauter des cases sans problme (la preuve, il n'y a pas de case n3 ni de case n4 dans le script prcdent). Vous pouvez afficher l'ensemble du contenu du tableau d'un seul coup en utilisant ${tableau[*]} :
1 2 3 4 5 #!/bin/bash tableau=('valeur0' 'valeur1' 'valeur2') tableau[5]='valeur5' echo ${tableau[*]}

valeur0 valeur1 valeur2 valeur5

IX) if : la condition la plus simple 1) si


Le type de condition le plus courant est le if, qui signifie "si". Les conditions ont la forme suivante : Algo : FILALI MOULAY RACHID Page : 57

SI test_de_variable ALORS ------> effectuer_une_action FIN SI La syntaxe en bash est la suivante :


1 if [ test ] 2 then 3 echo "C'est vrai" 4 fi

Le mot "fi" (if l'envers !) la fin indique que le if s'arrte l. Tout ce qui est entre le then et le fi sera excut uniquement si le test est vrifi. RQ !!: Vous noterez, c'est trs important, qu'il y a des espaces l'intrieur des crochets. On ne doit pas crire [test] mais [ test ] ! Il y a une autre faon d'crire le if : en plaant le then sur la mme ligne. Dans ce cas, il ne faut pas oublier de rajouter un point-virgule aprs les crochets :
1 if [ test ]; then echo "C'est vrai" 2 3 fi

A la place du mot "test", il faut indiquer votre test. C'est cet endroit que vous testerez la valeur d'une variable par exemple. Nous allons voir ici un cas simple o nous testons la valeur d'une chane de caractres, puis nous apprendrons faire des tests plus compliqus un peu plus loin. Faisons quelques tests sur un script que nous appellerons "conditions.sh" :
1 2 3 4 5 6 7 8 #!/bin/bash nom="Formateur" if [ $nom = "Formateur" ] then echo "Salut Formateur !" fi

Comme $nom est bien gal "Formateur", ce script affichera :


Salut Formateur !

Essayez de changer le test, si vous n'crivez pas prcisment "Formateur", le if ne sera pas excut, et donc votre script n'affichera rien. Notez aussi que vous pouvez tester 2 variables la fois dans le if :
1 #!/bin/bash

FILALI MOULAY RACHID

Page :

58

2 3 4 5 6 7 8 9

nom1="TRI" nom2="TRI" if [ $nom1 = $nom2 ] then echo "Salut les jumeaux !" fi

2) Sinon
Si vous souhaitez faire quelque chose de particulier quand la condition n'est pas remplie, vous pouvez rajouter un "else" qui signifie "sinon". Algo: SI test_de_variable ALORS ------> effectuer_une_action SINON ------> effectuer_une_autre_action FIN SI La syntaxe en bash est la suivante :
1 2 3 4 5 6 if [ test ] then echo "C'est vrai" else echo "C'est faux" fi

Reprenons notre script de tout l'heure, et ajoutons-lui un else :


1 2 3 4 5 6 7 8 9 10 #!/bin/bash nom="Formateur" if [ $nom = "Formateur" ] then echo "Salut Formateur !" else echo "Je te connais pas!" fi

Bon, comme la variable vaut toujours la mme chose, le else ne sera jamais excut, je vous propose plutt de vous baser sur le premier paramtre ($1) envoy au script :
1 #!/bin/bash 2 3 if [ $1 = "Formateur" ] 4 then 5 echo "Salut Formateur !"

FILALI MOULAY RACHID

Page :

59

6 else 7 8 fi

echo "Je te connais pas!"

Testez maintenant votre script en lui donnant un paramtre :


$ ./conditions.sh Formateur Salut Formateur !

Et si vous mettez autre chose :


$ ./conditions.sh Formateur2 Je te connais pas!

Notez que le script plante si vous oubliez de l'appeler avec un paramtre. Pour bien faire, il faudrait d'abord vrifier dans un if s'il y a au moins un paramtre. Nous apprendrons faire cela plus loin.

3) Sinon si
Il existe aussi le mot-cl "elif", abrviation de "else if", qui signifie "sinon si". Sa forme ressemble cela : Algo : SI test_de_variable ALORS ------> effectuer_une_action SINON SI autre_test ALORS ------> effectuer_une_action SINON SI encore_un_autre_test ALORS ------> effectuer_une_action SINON ------> effectuer_une_action FIN SI On peut mettre autant de "sinon si" qu'on veut. L j'en ai mis deux. En revanche, on ne peut mettre qu'un seul "sinon", qui sera excut la fin si aucune des conditions prcdentes n'est vrifie. Bash va d'abord analyser le premier test. S'il est vrifi, il effectuera la premire action indique, sinon il ira au premier sinon si, au second, etc., jusqu' trouver une condition qui soit vrifie. Si aucune condition n'est vrifie, c'est le "sinon" qui sera lu. Bien, voyons comment cela s'crit en bash :
1 if [ test ] 2 then 3 echo "Le premier test a t vrifi"

FILALI MOULAY RACHID

Page :

60

4 5 6 7 8 9 10 11 12

elif [ autre_test ] then echo "Le second test a t vrifi" elif [ encore_autre_test ] then echo "Le troisime test a t vrifi" else echo "Aucun des tests prcdents n'a t vrifi" fi

On peut reprendre notre script prcdent et l'adapter pour utiliser des elif :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash if [ $1 = "TRI1" ] then echo "Salut TRI1 !" elif [ $1 = "TRI2" ] then echo "Bien le bonjour TRI2" elif [ $1 = "TRI3" ] then echo "Salut TRI3, a va ?" else echo "Je te connais pas !" fi

Vous pouvez tester ce script, encore une fois n'oubliez pas d'envoyer un paramtre sinon il plantera, ce qui est normal.

X) Les tests
Voyons maintenant un peu quels tests on peut faire. Pour l'instant on a juste test si 2 chanes de caractres taient identiques, mais on peut faire beaucoup plus de choses que a !

1) Les diffrents types de tests


On peut faire 3 types de tests diffrents en bash :

Tests sur des chanes de caractres Tests sur des nombres Tests sur des fichiers

a) Tests sur des chanes de caractres


Comme vous le savez maintenant, en bash toutes les variables sont considres comme des chanes de caractres. Il est donc trs facile de tester ce que vaut une chane de caractres. Condition $chaine1 = $chaine2 Signification Teste si les 2 chanes sont identiques. Notez que bash est sensible la casse : "b" est donc diffrent de "B". Page : 61

FILALI MOULAY RACHID

Condition $chaine1 != $chaine2 -z $chaine -n $chaine

Signification Il est aussi possible d'crire 2 "==" pour les habitus du langage C. Teste si les 2 chanes sont diffrentes Teste si la chane est vide Teste si la chane est non vide

Testons par exemple si 2 paramtres sont diffrents :


1 2 3 4 5 6 7 8 #!/bin/bash if [ $1 != $2 ] then echo "Les 2 paramtres sont diffrents !" else echo "Les 2 paramtres sont identiques !" fi

$ ./conditions.sh TRI1 TRI2 Les 2 paramtres sont diffrents ! $ ./conditions.sh TRI1 TRI1 Les 2 paramtres sont identiques !

On peut aussi tester si le paramtre existe avec -z (teste si la chane est vide). En effet, si une variable n'est pas dfinie, elle est considre comme vide par bash. On peut donc par exemple s'assurer que $1 existe comme ceci :
1 2 3 4 5 6 7 8 #!/bin/bash if [ -z $1 ] then echo "Pas de paramtre" else echo "Paramtre prsent" fi

$ ./conditions.sh Pas de paramtre $ ./conditions.sh param Paramtre prsent

b) Tests sur des nombres


Bien que bash gre les variables comme des chanes de caractres pour son fonctionnement interne, rien ne nous empche de faire des comparaisons de nombres si ces variables contiennent des nombres. Condition $num1 -eq $num2 Signification Teste si les nombres sont gaux (equal). A ne pas confondre avec le Page : 62

FILALI MOULAY RACHID

Condition

$num1 -ne $num2 $num1 -lt $num2 $num1 -le $num2 $num1 -gt $num2 $num1 -ge $num2

Signification "=" qui, lui, compare 2 chanes de caractres. Test si les nombres sont diffrents (non equal). Encore une fois, ne confondez pas avec "!=" qui est cens tre utilis sur des chanes de caractres. Teste si num1 est infrieur ( < ) num2 (lower than) Teste si num1 est infrieur ou gal ( <= ) num2 (lower or equal) Teste si num1 est suprieur ( > ) num2 (greater than) Teste si num1 est suprieur ou gal ( >= ) num2 (greater or equal)

Testons par exemple si un nombre est suprieur ou gal un autre nombre :


1 2 3 4 5 6 7 8 #!/bin/bash if [ $1 -ge 20 ] then echo "Vous avez envoy 20 ou plus" else echo "Vous avez envoy moins de 20" fi

$ ./conditions.sh 23 Vous avez envoy 20 ou plus $ ./conditions.sh 11 Vous avez envoy moins de 20

c) Tests sur des fichiers


Un des avantages de bash sur d'autres langages est qu'on peut trs facilement faire des tests sur des fichiers : savoir s'ils existent, si on peut crire dedans, s'ils sont plus vieux, plus rcents, etc. Condition -e $nomfichier -d $nomfichier -f $nomfichier -L $nomfichier -r $nomfichier -w $nomfichier -x $nomfichier $fichier1 -nt $fichier2 $fichier1 -ot $fichier2 Signification Teste si le fichier existe Teste si le fichier est un rpertoire. N'oubliez pas que sous Linux, tout est considr comme un fichier, mme les rpertoires ! Teste si le fichier est un... fichier. Un vrai fichier cette fois, pas un dossier. Teste si le fichier est un lien symbolique (raccourci) Teste si le fichier est lisible (r) Teste si le fichier est modifiable (w) Teste si le fichier est excutable (x) Teste si fichier1 est plus rcent que fichier2 (newer than) Teste si fichier1 est plus vieux que fichier2 (older than)

FILALI MOULAY RACHID

Page :

63

Je vous propose de faire un script qui demande l'utilisateur de rentrer le nom d'un rpertoire, et qui vrifie si c'est bien un rpertoire :
1 2 3 4 5 6 7 8 9 10 #!/bin/bash read -p 'Entrez un rpertoire : ' repertoire if [ -d $repertoire ] then echo "Bien, vous avez compris ce que j'ai dit !" else echo "Vous n'avez rien compris..." fi

Entrez un rpertoire : /home Bien, vous avez compris ce que j'ai dit ! Entrez un rpertoire : rienavoir.txt Vous n'avez rien compris...

Notez que bash vrifie au pralable que le rpertoire existe bel et bien.

2) Effectuer plusieurs tests la fois


Dans un if, il est possible de faire plusieurs tests la fois. En gnral, on vrifie :

Si un test est vrai ET qu'un autre test est vrai Si un test est vrai OU qu'un autre test est vrai

Les 2 symboles connatre sont :


&& : signifie "et" || : signifie "ou"

Il faut encadrer chaque condition par des crochets. Prenons un exemple :


1 2 3 4 5 6 7 8 9 #!/bin/bash if [ $# -ge 1 ] && [ $1 = 'password' ] then echo "Bravo !" echo "Vous connaissez le mot de passe" else echo "Vous n'avez pas le bon mot de passe" fi

Le test vrifie 2 choses : FILALI MOULAY RACHID Page : 64

Qu'il y a au moins un paramtre ("si $# est suprieur ou gal 1") Que le premier paramtre est bien password ("si $1 est gal password")

Si ces 2 conditions sont remplies, alors le message indiquant qu'on a trouv le bon mot de passe s'affichera.
$ ./conditions.sh password Bravo ! Vous connaissez le mot de passe

Notez que les tests sont effectus l'un aprs l'autre, et seulement s'ils sont ncessaires. Bash vrifie d'abord s'il y a au moins un paramtre. Si ce n'est pas le cas, il ne fera pas le second test puisque la condition sera de toute faon fausse.

3) Inverser un test
Il est possible d'inverser un test en utilisant la ngation. En bash, c'est le point d'exclamation "!" qui exprime la ngation.
1 if [ ! -e fichier ] 2 then echo "Le fichier n'existe pas" 3 4 fi

XI) case : tester plusieurs conditions la fois


On a vu tout l'heure un if un peu complexe, qui faisait appel des elif et un else :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash if [ $1 = "TRI1" ] then echo "Salut TRI1 !" elif [ $1 = "TRI2" ] then echo "Bien le bonjour TRI2" elif [ $1 = "TRI3" ] then echo "Salut TRI3, a va ?" else echo "Je te connais pas, !" fi

Ce genre de "gros if qui teste toujours la mme variable" ne pose pas de problme mais n'est pas forcment trs facile lire pour le programmeur. On peut utiliser si on veut la place l'instruction case. FILALI MOULAY RACHID Page : 65

Le rle de case est de tester la valeur d'une mme variable, mais de manire plus concise et lisible. Voyons comment on crirait la condition prcdente avec un case :
1 #!/bin/bash 2 3 case $1 in 4 "TRI1") 5 6 "TRI2") 7 8 9 10 "TRI3") 11 12 13 *) 14 15 16 Esac

echo "Salut TRI1 !" ;; echo "Bien le bonjour TRI2" ;; echo "Salut TRI3, a va ?" ;; echo "Je te connais pas,!" ;;

Analysons la structure du case !


1 case $1 in

Tout d'abord, on indique que l'on veut tester la valeur de la variable $1. Bien entendu, vous pouvez remplacer $1 par n'importe quelle variable que vous voulez tester.
1 "TRI1")

L, on teste une valeur. Cela signifie "Si $1 est gal TRI1". Notez qu'on peut aussi utiliser une toile comme joker : "T*" acceptera tous les mots qui commencent par un T majuscule. Si la condition est vrifie, tout ce qui suit est excut jusqu'au prochain double point-virgule
1 ;;

Important, il ne faut pas l'oublier : le double point-virgule dit bash d'arrter la lecture du case l. Il saute donc la ligne qui suit le "esac" qui signale la fin du case.
1 *)

C'est en fait le "else" du case. Si aucun des tests prcdents n'a t vrifi, alors c'est cette section qui sera lue.
1 esac

Marque la fin du case (esac, c'est "case" l'envers !). On peut aussi faire des "ou" dans un case. Dans ce cas, petit pige, il ne faut pas mettre deux || FILALI MOULAY RACHID Page : 66

mais un seul ! Exemple :

1 #!/bin/bash 2 3 case $1 in 4 "Chien" | "Chat" | "Souris") 5 echo "C'est un mammifre" ;; 6 "Moineau" | "Pigeon") 7 8 echo "C'est un oiseau" 9 ;; 10 *) 11 echo "Je ne sais pas ce que c'est" 12 ;; 13 esac

XII) while : boucler "tant que"


Le type de boucle que l'on rencontre le plus couramment en bash est le while. Le principe est de faire un code qui ressemble ceci : Algo TANT QUE test FAIRE ------> effectuer_une_action RECOMMENCER En bash, on l'crit comme ceci :
1 while [ test ] 2 do 3 echo 'Action en boucle' 4 done

Il est aussi possible, comme pour le if, d'assembler les 2 premires lignes en 1, condition de mettre un point-virgule : while [ test ]; do echo 'Action en boucle' done On va demander l'utilisateur de dire "oui", et rpter cette action tant que l'utilisateur n'a pas fait ce qu'on voulait. On va crer un script boucles.sh pour l'occasion :
1 #!/bin/bash 2 3 while [ -z $reponse ] || [ $reponse != 'oui' ]

FILALI MOULAY RACHID

Page :

67

4 do 5 6 done

read -p 'Dites oui : ' reponse

On fait 2 tests :

Est-ce que $reponse est vide ? Est-ce que $reponse est diffrent de "oui" ?

Comme il s'agit d'un OU (||), tant que l'un des 2 tests est vrai, on recommence la boucle. La boucle pourrait se traduire par : "Tant que la rponse est vide ou que la rponse est diffrente de oui". On est oblig de vrifier d'abord si la variable n'est pas vide, car sinon le second test plante. Comme vous pouvez le voir, il ne s'arrte que lorsqu'on a tap oui ! Il existe aussi le mot-cl until, qui est l'exact inverse de while. Il signifie "Jusqu' ce que". Remplacez juste "while" par "until" dans le code prcdent pour l'essayer.

XIII) for : boucler sur une liste de valeurs


Avertissement le "for" en bash ne se comporte pas de la mme manire que le for auquel vous tes habitus dans un autre langage, comme le C. Lisez donc attentivement.

1) Parcourir une liste de valeurs


La boucle "for" permet de parcourir une liste de valeurs, et de boucler autant de fois qu'il n'y a de valeurs. Concrtement, la forme d'un for est la suivante : Algo : POUR variable PRENANT valeur1 valeur2 valeur3 FAIRE ------> effectuer_une_action VALEUR_SUIVANTE

La "variable" va prendre successivement les valeurs "valeur1", "valeur2", "valeur3". La boucle va donc tre excute 3 fois, et chaque fois la variable vaudra une nouvelle valeur de la liste. En bash, la boucle for s'crit comme ceci :
1 #!/bin/bash 2 3 for variable in 'valeur1' 'valeur2' 'valeur3'

FILALI MOULAY RACHID

Page :

68

4 do 5 6 done

echo "La variable vaut $variable"

Ce qui donne, si on l'excute :


La variable vaut valeur1 La variable vaut valeur2 La variable vaut valeur3

Vous pouvez donc vous servir du for pour faire une boucle sur une liste de valeurs que vous dfinissez :
1 2 3 4 5 6 #!/bin/bash for animal in 'chien' 'souris' 'moineau' do echo "Animal en cours d'analyse : $animal" done

Animal en cours d'analyse : chien Animal en cours d'analyse : souris Animal en cours d'analyse : moineau

Toutefois, la liste de valeurs n'a pas besoin d'tre dfinie directement dans le code. On peut utiliser une variable :
1 2 3 4 5 6 7 8 #!/bin/bash liste_fichiers=`ls` for fichier in $liste_fichiers do echo "Fichier trouv : $fichier" done

Ce script liste tous les fichiers trouvs dans le rpertoire actuel :


Fichier trouv : boucles.sh Fichier trouv : conditions.sh Fichier trouv : variables.sh

On pourrait faire un code plus court, sans passer par une variable $liste_fichiers, en crivant :
1 2 3 4 5 6 #!/bin/bash for fichier in `ls` do echo "Fichier trouv : $fichier" done

Bien entendu, ici on ne fait qu'afficher le nom du fichier, ce qui n'est pas trs amusant ni trs utile. On pourrait se servir de notre script pour renommer chacun des fichiers du rpertoire FILALI MOULAY RACHID Page : 69

actuel en leur ajoutant un suffixe -old par exemple :


1 2 3 4 5 6 #!/bin/bash for fichier in `ls` do mv $fichier $fichier-old done

Essayons de voir si l'excution du script renomme bien tous les fichiers :


$ ls boucles.sh conditions.sh variables.sh $ ./boucles.sh $ ls boucles.sh-old conditions.sh-old variables.sh-old

A vous de jouer ! Essayez de crer un script multirenommage.sh bas sur ce principe qui va rajouter le prfixe -old... uniquement aux fichiers qui correspondent au paramtre envoy par l'utilisateur !
./multirenommage.sh *.txt

Si aucun paramtre n'est envoy, vous demanderez l'utilisateur de saisir le nom des fichiers renommer avec read.

Un for plus classique


Pour les habitus d'autres langages de programmation, le "for" est une boucle qui permet de faire prendre une variable une suite de nombres. En bash, comme on l'a vu, le "for" permet de parcourir une liste de valeurs. Toutefois, en trichant un peu l'aide de la commande seq, il est possible de simuler un for classique :
1 2 3 4 5 #!/bin/bash for i in `seq 1 10`; do echo $i done

Explication : seq gnre tous les nombres allant du premier paramtre au dernier paramtre, donc 1 2 3 4 5 6 7 8 9 10 :
1 2 3 4 5 6 7 8

FILALI MOULAY RACHID

Page :

70

9 10

Si vous le voulez, vous pouvez changer le pas et avancer de 2 en 2 par exemple. Dans ce cas, il faut crire seq 1 2 10 pour aller de 1 10 en avanant de 2 en 2. Cela va donc gnrer les nombres 1 3 5 7 9.

Exercices

#exercice 1 #afficher le nombre de lignes correspondant #au contenu du repertoire passe en parametre b=`ls -l $1 | wc -l` b=$(expr $b - 1) echo $b #vous remarquerez qu'en fait les entres comptees #incluent la ligne 1 affichee par ls #c'est a dire : total ... #conclusion on soustrait 1 a la variable b #pour avoir le nombre reel d'entrees

#exercice 2 #afficher le contenu du fichier passe #en parametre #si le fichier existe test -f $1 if [ $? = 0 ] then cat $1 else echo "fichier inexistant" fi

exercice 3 # afficher la liste des users loggues # s'il y en a plus de 3 b=`who | wc -l` if [ $b -gt 3 ] then who fi #exercice 4 #passer en argument un nom #si c'est un fichier, attribuer le droit d'execution aux autres FILALI MOULAY RACHID Page : 71

#si c'est un repertoire, attribuer le droit de navigation aux autres # et retirer celui d'ecriture au groupe test -f $1 if [ $? = 0 ] # c'est un fichier then chmod o+x $1 test -d $1 fi # if [ $? = 0 ] #c'est un repertoire then chmod g-w $1 chmod o+x $1 fi

#exercice 5 #tester si la valeur passee en parametre #est paire ou impaire val=$(expr $1 % 2) if [ $val = 0 ] then #$1 a une valeur paire echo bravo else echo loupe fi

#exercice 6 #afficher le nombre d'arguments passes #s'il est superieur a 3 #afficher SUP 3 echo $# if [ $# -gt 3 ] then echo SUP 3 fi

FILALI MOULAY RACHID

Page :

72

PARTIE III : EXERCICES DE REVISION 0 Installation Linux


Installation
Question 0.1 Quelles sont les deux partitions qu'un systme doit avoir au minimum ? Question 0.2 Pourquoi est-il mieux de placer le rpertoire /var dans une partition indpendante ? Question 0.3 Pourquoi est-ce mieux de placer le rpertoire /home dans une partition indpendante ? Rponse 0.1 Swap et / Rponse 0.2 Pour optimiser les performances, /var peut tre utilis sur un disque rapide. Rponse 0.3 Pour la sauvegarde et aussi pour la maintenance. Le disque peut facilement tre enlev ou chang sans affecter le systme courant.

Grub
Question0.1 Est-il possible d'installer un chargeur de dmarrage sur une disquette ? Question0.2 Quel est le fichier de configuration de LILO ? Question0.3 LILO peut-il accder au systme de fichiers pour lire son fichier de configuration ? Question0.4 Quel est le meilleur emplacement pour GRUB et LILO sur un disque dur IDE ? Question0.5 Quel est le nom et l'emplacement du fichier de configuration de GRUB? Question0.6 Quelle est la commande pour installer un nouveau LILO dans le MBR ? Question0.7 Quelle est la commande pour installer un nouveau GRUB dans le MBR ? Question0.8 Qu'est-ce que le initrd ? Rponse0.1 oui. Rponse0.2 /etc/lilo.conf Rponse0.3 non. Rponse0.4 Dans le MBR. FILALI MOULAY RACHID Page : 73

Rponse0.5 /boot/grub/menu.lst Rponse0.6 [root@test ] /# lilo Rponse0.7 [root@test ] /# grub > root (hd0,1) > initrd /boot/initrd >boot Rponse0.8 initrd est la mmoire disque minimale pour le noyau pour dmarrer et monter les systmes de fichiers. Exercice0.1 Installez Grub sur une disquette et essayez de dmarrer manuellement sur votre image: [root@test ] /# mkfs -t ext2 /dev/fd0 [root@test ] /# mount /dev/fd0 /mnt [root@test ] /# mkdir -p /mnt/boot/grub [root@test ] /# cp /boot/grub/stage* /mnt/boot/grub/ [root@test ] /# cp /boot/grub/e2fs_stage1_5 /mnt/boot/grub/ [root@test ] /# touch /mnt/boot/grub [root@test ] /# umount /mnt [root@test ] /# grub > root (fd0) > setup (fd0) > quit Redmarrez ensuite sur la disquette et, au prompte, slectionnez le noyau sur le disque dur. > est le prompte propos par GRUB, et les lecteurs hd0,1 et /dev/hda2 doivent tre remplacs par l'un de ceux utiliss dans votre systme. Les lignes suivantes mritent toute votre attention avant d'tre tapes. > root (hd0,1) > kernel /boot/vmlinuz root=/dev/hda2 read-only > initrd /boot/initrd > boot Exercice0.2 Crez le fichier /boot/grub/menu.lst et installez Grub sur votre disque dur en utilisant les utilitaires proposs par Grub. Exercice0.3 Rinstallez Lilo. Dans le fichier /etc/lilo.conf, changez le label Linux de l'image par dfaut du noyau par "kangaroo" et rinstallez le programme Lilo dans le MBR. Exercice0.4 Quelle commande permet de supprimer Lilo ? Rponse0.1 Suivre la procdure. Rponse0.2 FILALI MOULAY RACHID Page : 74

Tapez la commande: [root@test ] /# grub root (hd0,0) # partition boot puis: setup (hd0) # Where to install the boot record MBR quit Editez le fichier /boot/grub/menu.lst et inscrire les lignes suivantes: default 0 timeout 30 title=Mon exemple de Gentoo Linux root (hd0,0) kernel (hd0,0)/boot/bzImage root=/dev/hda3 Rponse0.3 Pour rinstaller lilo, dans un premier temps, il faut garder la disquette de grub et voir la question 0.1. Dsinstallez grub et installez le programme lilo. Modifiez le fichier /etc/lilo.conf et tapez au prompte la commande lilo afin que celui-ci soit install dans le MBR. Vous pouvez redmarrer votre machine et utilisez lilo comme chargeur de dmarrage. Rponse 13.4 La commande utiliser pour enlever lilo du MBR est lilo -U .

1 Travailler en ligne de commande


Question 1.1 Quelles sont les informations dont vous avez besoin pour vous connecter un systme Unix ou Linux ? Question 1.2 Quand .bashrc est-il excut ? Question 1.3 Que sont les commandes intgres (built-in) ? Question 1.4 Quelle commande faut-il utiliser pour connatre la source d'une commande ? Question 1.5 Quelle syntaxe faut-il utiliser pour dmarrer un programme en arrire-plan ? Question 1.6 Quelle option permet de bloquer un compte utilisateur ? Question 1.7 Comment vrifiez-vous qu'un compte est bien bloqu ? Question 1.8 Comment savez-vous si votre prompte est un prompte root dans un terminal bash ? Question 1.9 Dans quel fichier pouvez vous redfinir la longueur maximum du mots de passe ? Question 1.10 Dans le fichier /etc/passwd, quoi correspond le chiffre indiqu dans le quatrime champ d'un compte utilisateur ? FILALI MOULAY RACHID Page : 75

Question 1.11 Quelle est l'option utiliser avec la commande useradd pour crer automatiquement l'accs au shell et le rpertoire personnel ? Rponse 1.1 Un login et un mot de passe. Rponse 1.2 Excut pour chaque par bash pour chaque nouveau shell interactif. Rponse 1.3 Une commande intgre (built-in) est une commande excute dans un shell. Rponse 1.4 [root@test ] /# whereis ls Rponse 1.5 [root@test ] /# xeyes & Rponse 1.6 [root@test ] /# passwd -l [username] Rponse 1.7 Le ! devant le mot de passe encrypt signifie que le compte est bloqu. Rponse 1.8 [root@test ] /# Le # signifie que vous tes connect en root. Rponse 1.9 Le fichier est /etc/login.defs. Rponse 1.10 Il signifie l'identit du groupe primaire (GID) pour un utilisateur. Rponse 1.11 L'option est -m. Exercice 1.1 Trouvez les informations sur les commandes useradd et userdel. Exercice 1.2 Crez deux nouveaux comptes user1 et user2 et attribuez leur des mots de passe avec la comma nde passwd. Exercice 1.3 En tant que root, bloquez les comptes et vrifiez ensuite en essayant de vous connecter. Exercice 1.4 Quelle commande sert concatner des fichiers ? Exercice 1.5 Dclarez et initialisez les variables d'environnement suivantes : NAME et LASTNAME. Utilisez echo pour les afficher. Exercice 1.6 Lancez un bash et vrifiez que ces variables ont bien t dclares. Exercice 1.7 Utilisez exec pour ouvrir une nouvelle session bash: Peut-on encore voir ces variables ? Exercice 1.8 Utilisez la commande date pour afficher le mois courant. Exercice 1.9 Editez le fichier .bashrc dans le rpertoire home et ajoutez ces lignes : FILALI MOULAY RACHID Page : 76

alias ls='ls --color' alias ll='ls --color -l' Expliquez leur action ? Rponse 1.1 Pour avoir des information sur les commandes, utiliser l'aide systme: [root@test ] /# man useradd [root@test ] /# man userdel Rponse 1.2 cration des utilisateurs: [root@test ] /# useradd -m user1 [root@test ] /# useradd -m user2 Cration des mots de passe des utilisateurs: [root@test ] /# passwd user1 (entrer le mot de passe et le confirmer) [root@test ] /# passwd user2 (entrer le mot de passe et le confirmer) Se dconnecter de la session root et se connecter avec les deux comptes crs (user1 user2). Rponse 1.3 [root@test ] /# passwd -l user1 [root@test ] /# passwd -l user2 Rponse 1.4 La commande utilise pour concatner les fichiers est cat. Rponse 1.5 Cration d'une variable: [root@test ] /# name=jance [root@test ] /# LASTNAME=roberto Pour afficher le contenu des variables, procder comme suit: [root@test ] /# echo $name; echo $LASTNAME Rponse 1.6 Si on dmarre un nouveau bash, les variables cres ne sont pas effectives. Pour cela il faut faire un export des variables. Rponse 1.7 Non car nous avons chang d'environnement. Rponse 1.8 [root@test ] /# Date +"%m" Rponse 1.9 Les lignes ajoutes dans le fichier .bashrc permettent de crer des alias la commande ls. Le pr emier alias permet d'afficher en couleur le rsultat de ls. Le deuxime alias permet d'afficher en couleur et d'utiliser l'option -l de la commande ls -l en utilisant la commande ll.

2 Traiter les flux de texte l'aide des filtres


Question 2.1 O va le rsultat de cat? Question 2.2 Comment rediriger la sortie de la commande cat? Question 2.3 FILALI MOULAY RACHID Page : 77

Quelle commande est approprie pour lire un fichier de log? Question 2.4 Comment ajouter un numro aux lignes d'un fichier? Question 2.5 Comment faites vous pour compter le nombre de mots dans un fichier? Question 2.6 Quelle commande vous permet de transformer des minuscules en majuscules? Question 2.7 Quelle commande faut-il utiliser pour classer alphabtiquement le contenu d'un fichier ? Question 2.8 Est-ce que le format ELF vous permet d'excuter le mme programme binaire sur des architectures x86 et PPC? Rponse2.1 cat crit sur stdout (la sortie standard), le plus souvent un terminal. Rponse2.2 Avec les utilitaires de pipe (|) ou de redirection (<, >, >>). Rponse2.3 Il faut utiliser tail de la manire suivante: [root@test ] /# tail -f -s 1 /var/log/messages Rponse2.4 Avec l'utilitaire nl de la manire suivante: [root@test ] /# nl file Rponse2.5 Avec l'utilitaire wc de la manire suivante: [root@test ] /# wc -w file Rponse2.6 Avec l'utilitaire tr de cette manire: [root@test ] /# cat /etc/passwd | tr [a..z] [A..Z] Rponse2.7 Avec l'utilitaire sort de cette manire: [root@test ] /# sort file Rponse2.8 Non, ELF spcifie le format des fichiers binaires. La dfinition des instructions binaires est diffrente entre les architecture x86 et PPC. Exercice 2.1 Affichez le nombre de mots qui commencent par h dans tous les fichiers du rpertoire /etc. Exercice 2.2 Comment enregistrer un fichier de 2Mo sur deux disquettes de 1.44Mo ? Comment feriez-vous pour assembler ensuite les deux parties du fichier ? Exercice 2.3 Quelle commande utiliseriez-vous pour remplacer le dlimiteur : dans le fichier /etc/passwd par # ? Exercice 2.4 Combien de lignes pouvez-vous comptabiliser dans le fichier /etc/passwd ? Exercice 2.5 FILALI MOULAY RACHID Page : 78

Quelle commande permet d'afficher les 5 dernires lignes du fichier /etc/group ? Exercice 2.6 Combien de mots et de caractres le fichier /etc/passwd contient-il ? Exercice 2.7 Crez un fichier utilisateur dans votre rpertoire home qui contient tous les uid et le gid des comptes. Remplacez tous les : par un ESPACE. Exercice 2.8 Triez le fichier /etc/passwd avec le nom de l'utilisateur ? Rponse 2.1 La commande est: [root@test ] /# wc -w /etc/h* Rponse 2.2 La commande est: [root@test ] /# split -b 1m filename [root@test ] /# cat x* > filename ( pour reconstituer le fichier) Rponse 2.3 [root@test ] /# cat /etc/passwd | tr ":" "#" Rponse 2.4 La commande est: [root@test ] /# nl /etc/passwd ou [root@test ] /# cat -n /etc/passwd ou [root@test ] /# wc -l /etc/passwd Rponse 2.5 La commande est: [root@test ] /# tail -n 5 /etc/group Rponse 2.6 La commande est: [root@test ] /# wc -w -m /etc/passwd Rponse 2.7 La commande est: [root@test ] /# cut -d : -f 1,3,4 /etc/passwd > /home/toto/user && cat /home/ toto/user | tr ":" " " > /home/toto/user Rponse 2.8 La commande est [root@test ] /# sort -t : +0,-1 /etc/passwd

3 Effectuer la gestion de base des fichiers


Question 3.1 Comment faites vous pour lister les fichiers cachs ? Question 3.2 Comment faites vous pour lister les fichiers en format long ? Question 3.3 Est-ce que Linux distingue les fichiers par rapport leur extension ? FILALI MOULAY RACHID Page : 79

Question 3.4 A quoi correspond l'option -p de la commande mkdir ? Question 3.5 Quelles commandes et options doit-on utiliser pour copier un rpertoire, avec tous ses sous-rpertoires et leur contenu, d'un emplacement un autre ? Question 3.6 Quelle commande permet de dplacer des fichiers ou des rpertoires ? Question 3.7 Quelle commande faut-il utiliser pour rechercher tous les fichiers du rpertoire /tmp qui ont une extension .pdf ? Question 3.8 Quels sont les trois mcanismes de citation ? Question 3.9 Quelle est l'action de la commande suivante ? [root@test ] /# cp foo/bar bar/foo bar/foobar Rponse 3.1 [root@test ] /# ls -a Rponse 3.2 [root@test ] /# ls -l Rponse 3.3 NON. Il fait la distinction entre les types de fichiers grce un numro magique plac dans l'index du fichier. Rponse 3.4 Vous permet de crer plusieurs rpertoires dans une seule commande. Rponse 3.5 [root@test ] /# cp -r /home/me/* /backup/me Rponse 3.6 La commande est mv. Rponse 3.7 [root@test ] /# find /tmp -name *.pdf -print Rponse 3.8 Les 3 manires de commenter sont: '..', .., et \.. Rponse 3.9 Cette commande copie les fichiers bar et foo l'intrieur du rpertoire bar/foobar. Exercice 3.1 Trouver tous les fichiers dont les noms contiennent x suivi de in dans le rpertoire /etc en utilisant les jokers. Exercice 3.2 Trouver les fichiers dont les noms commencent par une lettre comprise entre a et e, contiennent au moins deux autres caractres et ne se terminent pas par un nombre. Exercice 3.3 Trouver les fichiers dont les noms se composent de quatre caractres et commencent par le caractre 'uppercase' en utilisant les jokers. Ne descendre dans aucun des rpertoires trouvs. Exercice 3.4 FILALI MOULAY RACHID Page : 80

Trouver les fichiers qui contiennent sh dans le rpertoire /bin en utilisant les jokers. Exercice 3.5 Affichez votre variable d'environnement HOME prcde par la phrase $HOME value is: Exercice 3.6 Affichez le contenu de $SHELL Exercice 3.7 Comment afficheriez-vous la chane de caractres suivante, avec echo en utilisant les doubles guillemets et \ ? *@#$%^&*()'"\ Exercice 3.8 Composez une commande avec echo pour afficher les trois chanes de caractres suivantes: * * That's it he said! 'Never Again! ' he replied.** Exercice 3.9 Composez une commande interactive qui permet d'effacer tous les fichiers .tmp dans le rpertoire home. Rpondre y chaque prompte. Exercice 3.10 Trouvez tous les fichiers dans le rpertoire home de l'utilisateur dont le nom se termine par .pdf, dont la taille est suprieure 50 blocks et qui n'ont pas t ouverts depuis 1 mois. Exercice 3.11 Crez un fichier file.h qui contiendra tous les noms de fichiers se terminant par .h et qui se trouvent dans le rpertoire /usr. Exercice 3.12 Faire un touch sur tous les fichiers c du rpertoire /usr/src/packages. Exercice 3.13 Quelles sont les permissions par dfaut accordes aux nouveaux fichiers et aux nouveaux rpertoires ? Exercice 3.14 Comment crer un nouveau fichier ou un nouveau rpertoire dont le nom contient un espace ? (Par exemple: 'new dir') Exercice 3.15 Quelle commande permet de supprimer tous les fichiers du type char et block dans votre rpertoire home ? Exercice 3.16 Comment trouver l'emplacement du programme find ? Exercice 3.17 Supprimer tous les fichiers dans le rpertoire /tmp qui n'appartiennent pas root et qui n'ont pas t ouverts depuis une semaine. Exercice 3.18 crivez la commande qui permet de changer le mot lynux par linux dans tous les fichiers avec l'extension html situs dans un rpertoire et tous ses sous-rpertoires. Exercice 3.19 Trouvez dans le rpertoire /usr les fichiers dont la taille dpasse 1Mo et dont les droits sont fixs 755 ? Exercice 3.20 FILALI MOULAY RACHID Page : 81

Combien de fichiers avez vous dans toute l'arborescence qui vous appartient et dont les droits sont fixs 644 ? Rponse 3.1 [root@test ] /# ls -d /etc/*x*in* Rponse 3.2 [root@test ] /# ls -d / [a-e]??*[!0-9] Rponse 3.3 [root@test ] /# s -d /etc/[A-Z]??? Rponse 3.4 [root@test ] /# s -d /bin/*sh* Rponse 3.5 [root@test ] /# echo "\$HOME value is:"$HOME Rponse 3.6 [root@test ] /# echo "$SHELL" Rponse 3.7 [root@test ] /# echo \@ \# \$ \% \^ \& \* \( \) \' \" \\ ou [root@test ] /# echo "@ # $ % ^ & * ( ) ' \" \\" Rponse 3.8 [root@test ] /# echo "**that's it he said! 'Nerver again!'he replied**" Rponse 3.9 La commande est: [root@test ] /# find /home -name "*.tmp" -ok rm {} \; ou [root@test ] /# find ~ -name "*.tmp" -exec rm -i {} \; Rponse 3.10 [root@test ] /# find /home -name "*.pdf" -size +50 -atime +30 -print Rponse 3.11 [root@test ] /# find /usr -name "*.h" -print > file.h Rponse 3.12 [root@test ] /# find /usr/src -type c -exec touch {} \; Le rpertoire /usr/src/packages n'existe pas sur Mandriva. Rponse 3.13 pour un nouveau dossier: 755 rwxr-xr-x pour un nouveau fichier: 644 rw-r-r-Rponse 3.14 La commande est: [root@test ] /# touch a\ b Le caractre "\" permet d'interprter le caractre espace comme un caractre. Rponse 3.15 La commande est: [root@test ] /# find ~ \( -type c -o -type b \) -exec rm -i {} \; ou [root@test ] /# find ~ -type c -type b -exec rm {} \; Rponse 3.16 La commande est: [root@test ] /# which find [root@test ] /# type find FILALI MOULAY RACHID Page : 82

[root@test ] /# whereis find Rponse 3.17 La commande est: [root@test ] /# find /tmp -not -user root -atime +7 -ok rm {}\; ou [root@test ] /# find /tmp \! -user root -atime +7 -exec rm {}\; Rponse 3.18 La commande est: [root@test ] /# find . -type f -name "*.html" -exec sed -i "s/lynux/linux/g" {} \; Regarder les pages man pour l'option -i de sed. Rponse 3.19 La commande est: [root@test ] /# find /usr (-size +2000 -a -perm 755) -print 2>/dev/null Rponse 3.20 [root@test ] /# find / (-user votrenomutilisateur -a -perm 644) | wc l

4 Utiliser les flux, les pipes et les redirections


Question 4.1 Quelle est l'entre standard d'un terminal ? Question 4.2 Quelle est l'erreur de sortie standard d'un terminal ? Question 4.3 Comment rediriger l'erreur standard vers la sortie standard ? Question 4.4 Comment annuler la sortie stderr ? Question 4.5 Comment lister les noms de fichiers page par page ? Question 4.6 Quelle est la diffrence entre > et >> ? Question 4.7 Quels sont les utilitaires de xargs ? Question 4.8 Qu'est-ce qu'un pipe ? Rponse4.1 Le stdin par dfaut est le clavier. Rponse4.2 Le terminal. Rponse4.3 2>&1 Rponse4.4 En redirigeant vers /dev/null. Exemple: 2>/dev/null. Rponse4.5 [root@test ] /# ls -l |more Rponse4.6 > est utilis pour rediriger un flux de donnes vers un fichier et >> ajoute le flux FILALI MOULAY RACHID Page : 83

un fichier. Rponse4.7 L'utilitaire xargs cr une ligne d'arguments depuis stdin. Rponse4.8 Un pipe est un mcanisme de communication inter-processus. Utilis dans une commande, il permet de connecter la sortie d'une commande l'entre d'une autre commande. Chaque commande s'excutant dans un contexte diffrent. Exercice 4.1 Crer un fichier list.bin qui contiendra tous les noms de fichier du rpertoire /bin. Exercice 4.2 Ecrire une commande qui exporte la liste des fichiers de /usr/local/bin dans le fichier appel list.bin puis affichez toutes les erreurs en sortie. Exercice 4.3 Divisez le fichier list.bin en des fichiers ne contenant que 50 lignes et supprimez list.bin. Exercice 4.4 Depuis les fichiers diviss, rcrez le fichier list.bin. Exercice 4.5 Simplifiez les commandes suivantes: [root@test ] /# ls *.c | xargs rm [root@test ] /# ls [aA]* | xargs cat [root@test ] /# cat `ls *.v` 2>/dev/null Exercice 4.6 Utilisez find pour trouver un quivalent la commande suivante: [root@test ] /# more `ls *.c` Exercice 4.7 crivez une commande qui permette de crer un fichier list.sbin dans le contenu de /sbin et en mme temps, affichez les sorties standards. Exercice 4.8 Crez un fichier dont le nom contient l'heure de sa cration. Exercice 4.9 Crez un fichier qui contient en ordre invers tous les noms de fichiers dont les extensions sont .conf et qui appartiennent au rpertoire /etc. Solution 4.1 La commande est: [root@test ] /# ls /bin > list.bin Solution 4.2 La commande est: [root@test ] /# ls /usr/local/bin >> ~/list.bin 2> /dev/null Solution 4.3 La commande est: [root@test ] /# split -l 50 list.bin [root@test ] /# rm list.bin Solution 4.4 La commande est: FILALI MOULAY RACHID Page : 84

[root@test ] /# cat x* > list.bin Solution 4.5 [root@test ] /# ls *.c | xargs rm [root@test ] /# rm *.c [root@test ] /# ls [aA]* | xargs cat [root@test ] /# cat [aA]* [root@test ] /# cat `ls *.v` 2>/dev/null [root@test ] /# cat *.v 2>/dev/null Attention, l'alias ls='ls --color' ou ls='ls --color=always' peut causer des problmes pour utiliser xargs. Solution 4.6 La commande est: [root@test ] /# find . -name "*.c" -maxdepth 1 | xargs more {} \; ou [root@test ] /# find . -name "*.c" -maxdepth 1 -exec more {} \; Si vous ne mettez pas -maxdepth, vous aurez tous les fichiers, pas seulement ceux du rpertoire courant. Solution 4.7 La commande est: [root@test ] /# ls /sbin | tee list.sbin Solution 4.8 La commande est: [root@test ] /# touch "il est `date +"%T"`" Solution 4.9 La commande est: [root@test ] /# ls /etc/*.conf | tac >invert_file.etc.conf ou [root@test ] /# ls -r /etc/*.conf > invert_file.etc.conf

5 Crer, grer et tuer un processus


Question 5.1 Quelle commande vous permet de vrifier facilement quel utilisateur consomme la plus grande partie des ressources processeur du systme ? Question 5.2 Est-ce que tous les processus ont un processus parent ? Question 5.3 Qu'arrive-t-il si un processus enfant perd son parent ? Question 5.4 Quel est le nom d'un programme ou d'une application actifs ? Question 5.5 Quelle commande permet d'envoyer un signal un processus ? Question 5.6 De quel lment avez-vous besoin pour envoyer un signal un processus? Question 5.7 Y a-t'il un moyen avec nice ou renice de prendre tout le temps processeur ? Question 5.8 Quel signal reoivent tous les processus lorsque la session bash partir de laquelle ils ont t lancs se termine ? FILALI MOULAY RACHID Page : 85

Rponse5.1 top. Rponse5.2 Oui, except le premier processus init. Rponse5.3 Le processus init deviendra son parent. Rponse5.4 Un processus Rponse5.5 kill Rponse5.6 La commande kill, le process ID et le numro de signal ou le nom envoyer. Rponse5.7 Non, cela va seulement augmenter la base sur laquelle l'ordonnanceur calcul le temps attribuer chaque processus. Tous les autres processus seront toujours en mesure de fonctionner. Rponse5.8 SIGSTOP Exercice 5.1 Quel est le processus de user et de root qui utilise le plus de mmoire ? Exercice 5.2 Ouvrez deux terminaux. Dans l'un deux, tapez la commande: [root@test ] /# while [ 1 ]; do echo -n The date is:; date; done Dans l'autre, vrifiez que vous avez la possibilit de stopper et de redmarrer les travaux. Exercice 5.3 Mme exercice que le 5.2, mais, faites en sorte que l'affichage de sortie s'arrte pendant 3 seconde et redmarre pendant 1 seconde de manire rptitive. Exercice 5.4 Faites que l'affichage de sortie de la commande ps soit formate de la manire suivante: username, commande et nice value. Exercice 5.5 Arrtez tous les processus nomms bash qui appartiennent votre propre utilisateur. Exercice 5.6 Avec la commande top, affichez les processus de root. Avec cette mme commande top, que devez-vous taper pour arrter un processus ? Exercice 5.7 Ouvrez deux terminaux: dans le premier, affichez priodiquement le niveau d'utilisation de la mmoire virtuelle. Dans le second, dsactivez la mmoire virtuelle et activez l de nouveau. Quels changements notez-vous dans le premier terminal. Exercice 5.8 Quelle est l'organisation des disques de votre systme ? Combien de disques avez-vous ?

FILALI MOULAY RACHID

Page :

86

Rponse 5.1 Faites un top puis tapez M et constatez quel utilisateur consomme le plus de mmoire. Rponse 5.2 kill -sigstop (ppid) (stop) kill -sigcont (ppid) (restart) Rponse 5.3 [root@test ] /# while [ 1 ]; do echo Stop the process; kill -sigstop pid; sleep 3; echo continuation; kill -sigcont pid; sleep 1; done Attention, la chane [ 1 ] s'crit avec des espaces autour des crochets. Rponse 5.4 La commande est: [root@test ] /# ps -eo "%U %c %n" Rponse 5.5 Utilisez ps et ajoutez les options pour afficher les noms d'utilisateurs. Localisez les bash qui appartiennent l'utilisateur root et utilisez la commande kill avec l'option dsire suivie du pid. Rponse 5.6 Tapez la commande top et appuyez sur la touche h pour afficher l'aide. Utilisez la touche u pour lister uniquement l'utilisateur choisi. Pour tuer un processus, utilisez la touche k pour kill et indiquer le pid du processus. Rponse 5.7 Dans le premier terminal, excutez la commande vmstat -n 1: les statistiques de la mmoire virtuelle sont en temps rel. Dans la deuxime console, excutez swapoff /dev/hdax Constatez ce qui ce passe dans le premier terminal. Une variation doit tre constate si la mmoire vive est utilise 100%. Rponse 5.8 Pour visualiser les disques et partitions du systme, utilisez la commande cfdisk ou df.

6 Utiliser les permissions pour contrler laccs aux fichiers


Question 6.1 Comment feriez-vous pour lister les permissions des noms de fichiers ? Question 6.2 Quelle commande permet d'ajouter la permission d'excution un fichier sans connatre ses permissions initiales ? Question 6.3 Que fait chgrp ? Question 6.4 Quelle commande et son option permettent de crer un lien physique ? Question 6.5 Si vous supprimez un lien symbolique, le fichier de destination est-il supprim lui aussi ? Question 6.6 FILALI MOULAY RACHID Page : 87

Est-ce que le sticky bit doit tre configur pour qu'un utilisateur puisse excuter un programme ? Question 7.7 Est-ce que chown change les permissions w,r,x de l'utilisateur ? Question 6.8 Que signifie la permission d'excution pour un fichier ? Rponse6.1 [root@test ] /# ls -l Rponse6.2 [root@test ] /# chmod +x file Rponse6.3 chgrp vous permet de changer le groupe pour un nom de fichier. Rponse6.4 la commande est ln sans option. Rponse6.5 Non. Rponse6.6 Non. Rponse7.7 Non, il change l'uid d'un nom de fichier. Rponse6.8 Cela signifie que vous pouvez chercher travers les rpertoires. Exercice 6.1 Effectuer ces oprations: Crez deux nouveaux rpertoires etc et bin dans votre rpertoire home. Copiez tous les fichiers de faon rcursive de /etc etc et de /bin bin. Dans votre rpertoire local etc, renommez tous les fichiers *.conf par *.conf.bak. Crez, dans votre rpertoire home, un lien symbolique appel mydir, qui pointe vers bin/ls. Vrifiez si mydir excute ls. Effacez le lien mydir. Est-ce que bin/ls est toujours prsent ? Mme question que prcdemment mais avec un lien physique. Effacez le lien mydir. Est-ce que bin/ls est toujours prsent ? Rponse 6.1 La commande est: [root@test ] /# cd /home/user/ [root@test ] /# mkdir etc bin La commande est: [root@test ] /# cp -r /etc/* /home/user/etc/ [root@test ] /# cp -r /bin/* /home/user/bin La commande est: [root@test ] /# rename .conf .conf.back *.conf ou [root@test ] /# for i in *.conf; do mv $i $i.back; done FILALI MOULAY RACHID Page : 88

La commande est: [root@test ] /# cd /home/user/ [root@test ] /# ln -s /bin/ls mydir La commande est: [root@test ] /# rm mydir La commande est: [root@test ] /# cd /home/user/ [root@test ] /# ln /bin/ls mydir Testez et donnez votre conclusion.

7 Les expressions rgulires


Question 7.1 A quoi sert le programme grep ? Question 7.2 A quoi sert le programme sed ? Question 7.3 Quel est le symbole pour n'importe quel caractre dans les regexp ? Question 7.4 Quel est le symbole signifiant la fin de ligne dans les regexp ? Question 7.5 Quel motif permet de trouver une chane commenant par une majuscule dans les regexp ? Question 7.6 Quel est le motif pour un mot ne contenant que des majuscules dans les regexp ? Question 7.7 Quelle est la principale diffrence entre vi et sed ? Question 7.8 Quelle commande faudra-t-il utiliser pour trouver des mots dans un flux de donnes ? Rponse7.1 grep est un utilitaire pour chercher des mots dans les fichiers ou les flots de donnes. Rponse7.2 sed est programme de filtre de texte qui peut tre utilis sur un flot de donnes. Rponse7.3 Le point (dot) Rponse7.4 Le $ Rponse7.5 [A-Z].* Rponse7.6 [A-Z]* Rponse7.7 FILALI MOULAY RACHID Page : 89

vi lit le stdin, sed utilise les arguments pour grer les flots de donnes. Rponse7.8 grep Exercice 7.1 Copiez tous les fichiers de /etc dans votre rpertoire home/etc/. Affichez ensuite le contenu de tous les fichiers *.conf en remplaant le mot host par machine. Exercice 7.2 Avec grep, affichez le contenu de tous les fichiers ~/etc/*.conf qui ne contiennent pas le mot root. Faites ensuite la mme opration avec sed. Exercice 7.3 Avec grep, imprimez tous les noms des groupes auxquels root appartient. Faites la mme opration avec la commande sed. Exercice 7.4 Listez tous les noms de groupe composs de 4 ou 5 caractres. Exercice 7.5 Listez tous les fichiers dans ~/etc/ qui ne contiennent pas de lignes vides. Exercice 7.6 Listez dans le rpertoire ~/etc/ tous les fichiers qui contiennent des caractres numriques. Exercice 7.7 Affichez avec ls uniquement les noms de rpertoires dans ~/etc. Exercice 7.8 Faites un ps aux, remplacez l'utilisateur root par toto et imprimez le dans un fichier appel new_process.txt. Exercice 7.9 Listez tous les processus appels apache appartenant un utilisateur dont le nom commence par p ou P. Exercice 7.10 Que fait la commande suivante ? [root@test ] /# sed 's/^\(.86\)/80\1/g' fichier Exercice 7.11 Avec grep et sed, dterminez l'adresse IP de votre machine en utilisant la commande ifconfig. Rponse 7.1 [root@test ] /# cp -r /etc [root@test ] /# cd /etc [root@test ] /# cat *.conf | sed 's/host/machines/g' ou [root@test ] /# find ~/etc -name *.conf -exec sed 's/host/machines/g' {} \; Rponse 7.2 Avec la commande grep: [root@test ] /# grep -L root *.conf | xargs cat Avec la commande sed: [root@test ] /# sed '/root/d' ~/etc/*.conf Rponse 7.3 La commande est: [root@test ] /# cut -f 1,4 -d : /etc/group | grep root FILALI MOULAY RACHID Page : 90

ou [root@test ] /# sed '/[:,]root/!d;s/\(^[^:]*\).*\([^:]*\)$/\1 : \2/g' /etc/group Rponse 7.4 La commande est: [root@test ] /# grep -o '^[^:]\{4,5\}\>' /etc/group Rponse 7.5 La commande est: [root@test ] /# grep -L '^ *$' /etc/* | xargs cat 2>/dev/null Rponse 7.6 La commande est: [root@test ] /# grep -l '[0-9]' ~/etc/* si on cherche les fichiers qui contiennent des chiffres. Rponse 7.7 La commande est: [root@test ] /# ls -l ~/etc/ | grep ^d ou [root@test ] /# ls -dF ~/etc/* | grep '.*\/$' ou [root@test ] /# ls -ld ~/etc/* | sed -n '/^d/s/.* \(.*\)$/\1/gp' ou alors... [root@test ] /# ls -d */ Attention aux aliases (ls='ls -F') Rponse 7.8 La commande est: [root@test ] /# ps aux | sed 's/root/toto/g' > new_process.txt Rponse 7.9 La commande est: [root@test ] /# ps aux | grep apache | grep '^[pP]' ou [root@test ] /# ps aux | sed -n '/^[pP].*apache/p Rponse 7.10 Elle remplace ce qui se trouve en dbut de ligne suivit d'un caractre quelconque suivit de la chane 86 par 80 et ce que l'on a remplac. Exemple : 586 devient 80586 Rponse 7.11 Avec la commande grep: [root@test ] /# ifconfig eth0 | grep '^[[:space:]]*inet addr:\([0-9]\ {1,3\}\.\)\{3\}[0-9]\{1,3\}' Avec la commande sed: [root@test ] /# ifconfig eth0 | sed -n -e 's/^[[:space:]]*inet addr:\(\ ([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/p'

8 Ldition de fichiers avec VI


Question 8.1 Qu'est-ce que .exrc ? Question 8.2 FILALI MOULAY RACHID Page : 91

O .exrc doit-il se trouver ? Question 8.3 Que fait dans vi la squence wq ? Question 8.4 Est-il possible d'utiliser une expression rgulire dans vi ? Question 8.5 Est-il possible d'utiliser la syntaxe de sed dans vi ? Question 8.6 Comment rechercher un mot dans vi ? Question 8.7 Comment annuler la dernire manipulation dans vi ? Question 8.8 Comment faites-vous pour rpter la dernire commande dans vi ? Rponse8.1 .exrc est le fichier de configuration de vi. Rponse8.2 Il doit tre localis dans le rpertoire home de l'utilisateur. Rponse8.3 Sauvegarder et quitter (Save and quit) Rponse8.4 oui Rponse8.5 oui Rponse8.6 :/word/ Rponse8.7 Avec le caractre u. Rponse8.8 Avec le caractre ".". Exercice 8.1 ditez un fichier que vous appellerez vitest avec vi. Quittez ensuite vi sans sauvegarder le fichier. Exercice 8.2 Editez le fichier vitest et crivez quelques lignes. Sauvegardez ensuite le fichier. Sauvegardez et quittez en une commande. Exercice 8.3 Comment utiliser l'aide de vi ? Exercice 8.4 Faites une copie de /etc/passwd dans votre rpertoire home. Editez ensuite cette copie avec vi. Changez chaque occurrence du mot root avec votre propre nom d'utilisateur. Exercice 8.5 Toujours dans la copie de /etc/passwd, faites une copie et collez quelques lignes. Effacez-les ensuite. Rponse 8.1 La commande est: FILALI MOULAY RACHID Page : 92

[root@test ] /# vi vitest Pour sortir de l'utilitaire vi sans sauvegarder le fichier : utiliser :q!. Rponse 8.2 La commande est: Pour diter, faire vi vitest Pour crire quelque ligne dans le fichier, passez en mode "insertion" en utilisant la touche i. Pour sauvegarder le fichier faire :w Pour sauvegarder et quitter le fichier, faire :wq. Rponse 8.3 Pour obtenir de l'aide sur l'utilitaire vi, lorsque vi est ouvert, il faut taper :h. Rponse 8.4 Copie de passwd dans /home/myhome: [root@test ] /# cp /etc/passwd /home/myhome/ Pour remplacer le mot root par mon nom, utiliser vi et faire : Se placer sur le mot remplacer et utiliser la commande cw Rponse 8.5 Pour copier une ligne avec l'utilitaire vi faire: yy Pour coller la ligne copier, faire: p Pour supprimer une ligne, faire: dd

9 Maintenir l'intgrit des systmes de fichiers


Question 9.1 Quel est le nombre maximum de partitions tendues? Question 9.2 Quel est le nom de fichier d'un disque SCSI complet? Question 9.3 Quelle est la diffrence entre ext2 et ext3? Question 9.4 Existe-t-il un standard de hirarchie de systmes de fichiers sous Linux? Question 9.5 Quelle commande permet de construire un systme de fichier sur une partition? Question 9.6 Pourra-t-on retrouver les anciennes donnes dans un nouveau systme de fichiers msdos? Question 9.7 Quelle commande doit-on utiliser pour connatre l'utilisation du disque? Question 9.8 Quelle commande permet de contrler un systme de fichiers? Rponse9.1 1 Rponse9.2 /dev/sda Rponse9.3 ext3 a des capacits de journalisation. FILALI MOULAY RACHID Page : 93

Rponse9.4 Oui, c'est le projet FHS. Rponse9.5 mkfs Rponse9.6 Non, la partition sera compltement crase. Rponse9.7 du Rponse9.8 Fsck

10 Contrler le montage et le dmontage d'un systme de fi chiers


Question 10.1 Quel fichier utilise la commande mount a pour monter un systme de fichiers? Question 10.2 Que signifie le mot noauto dans le fichier /etc/fstab ? Question 10.3 Que signifie le mot sync dans le fichier /etc/fstab ? Question 10.4 Que signifie le mot -o ro dans le fichier /etc/fstab ? Question 10.5 Peut-on dmonter un rpertoire courant d'un processus ? Question 10.6 Quelle commande permet de lister tous les rpertoires monts ? Question 10.7 Au dmarrage, avant de monter un systme de fichiers list dans /etc/fstab, que fait un systme ? Question 10.8 Doit-on monter un lecteur de disquettes pour accder un systme de fichiers de type msdos sur une disquette ? Rponse 10.1 /etc/fstab Rponse 10.2 Ne permet pas de monter automatiquement le lecteur. Rponse 10.3 Cela permet de synchroniser les donnes directement sur le lecteur pour chaque opration. Rponse 10.4 Pour monter le lecteur en mode lecture seule. Rponse 10.5 Non, car il est occup. Rponse 10.6 mount FILALI MOULAY RACHID Page : 94

Rponse 10.7 Il vrifie que le systme de fichiers n'est pas corrompu. Rponse 10.8 Oui Exercice 10.1 Crez une ligne dans /etc/fstab qui autorise l'accs du lecteur de disquettes tous les utilisateurs. Vrifiez que vous pouvez utiliser ce lecteur et que vous pouvez crer un fichier avec touch. Exercice 10.2 Faites la manipulation suivante: Crez un systme de fichiers ext2 sur le lecteur de disquettes. Montez le lecteur. Copiez tous les fichiers /etc/*.conf sur une disquette. Dmontez le lecteur. Que se passe-t-il ? Montez-le de nouveau et vrifiez que tous les fichiers sont bien prsents. Tapez la commande suivante: [root@test ] /# tar cvf /dev/fd0 /etc/*.conf Essayez de le monter de nouveau. Que se passe-t-il alors ? Utilisez tar pour visualiser le contenu de la disquette. Exercice 10.3 Le fichier /etc/fstab possde toutes les informations dont vous avez besoin pour monter un lecteur de disquettes. Quelle est la manire la plus simple de monter un lecteur de disquette ? Rponse 10.1 La nouvelle ligne ajouter dans le fichier fstab est: /dev/fd0 /mnt/floppy auto noauto, Rponse 10.2 [root@test ] /# mke2fs /dev/fd0 [root@test ] /# mount /dev/fd0 /mnt/floppy [root@test ] /# cp /etc/*.conf /mnt/floppy Quand on dmonte le lecteur de disquettes, les donnes sont synchronises (synchronisation des manipulations). La commande tar cvf /dev/fd0 /etc/*.conf permet de stocker une archive sur la disquette sans crer de systme de fichiers. La disquette ne peut tre monte, mais il est possible de rcuprer les informations qui se trouvent sur la disquette en dsarchivant le contenu de celle-ci. Pour visualiser le contenu de la disquette, il faut utiliser la commande: [root@test ] /# tar tvf /dev/fd0 Rponse 10.3 Pour monter un lecteur sans avoir besoin de tout spcifier, faire: [root@test ] /# mount /dev/fd0 /mnt/floppy La commande mount lit le fichier fstab et fait le lien avec le point de montage.

11 Grer les quotas disque


FILALI MOULAY RACHID Page : 95

Question 11.1 Dans quelle configuration de fichiers le mcanisme de quota doit-il tre spcifi ? Question 11.2 Quelle commande et quelle option permettent d'initialiser la base de donnes de quotas ? Question 11.3 Quelle commande devez-vous utiliser pour mettre en place les quotas dans le systme ? Question 11.4 Quelle commande, excute dans un cron permet de contrler priodiquement les quotas des utilisateurs ? Question 11.5 Quelle commande vous permet d'diter la priode de grce ? Rponse 11.1 /etc/fstab Rponse 11.2 [root@test ] /# quotacheck -acmugv Rponse 11.3 [root@test ] /# quotaon -av Rponse 11.4 [root@test ] /# /sbin/quotacheck -acmugv Rponse 11.5 [root@test ] /# edquota t Exercice 11.1 Mettez en place une limitation logicielle 500M pour tous les utilisateurs qui ont leur rpertoire home dans /home. Exercice 11.2 Mettez la priode de grce 0. Exercice 11.3 Connectez-vous comme utilisateur et vrifiez que la limitation est en place. Rponse 11.1 Dans un premier temps, mettre tous les utilisateurs concerns dans un mme groupe. Puis tapez la commande: [root@test ] /# edquota -g groupname (donne la limitation logicielle pour le quota) Rponse 11.2 Utilisez la commande edquota -t pour dfinir la priode de grce. Rponse 11.3 Utilisez la commande quota -v pour visualiser les limitations de travail.

FILALI MOULAY RACHID

Page :

96

12 Scripts Shell
Question 12.1 Faites deux scripts qui vous disent bonjour en affichant votre login (Bonjour, toto) : Quand vous tapez saluer [votre-login] Quand vous tapez juste saluer

Rponse12.1 Il faut diter un fichier saluer et le rendre ensuite xcutable :


#!/bin/sh if [ -n "$1" ]; then LOGIN=$1; else LOGIN=`whoami`; fi echo "Bonjour, $LOGIN"

Question 12.2 Faire un script qui affiche la phrase : Le script [params] a [n] paramtre(s), que voici : [paramtres], en remplaant les mots entre crochets par leur valeur; par exemple :
chaland ~ $ params bla ble bli blo blu La commande params a 5 paramtre(s), que voici : bla ble bli blo blu

Rponse 12.2
#!/bin/sh echo "La commande $0 a $# paramtre(s), que voici| : $@"

FILALI MOULAY RACHID

Page :

97

Qestion 12.3 Crez une commande qui, lorsqu'elle est appele, renvoie le nombre d'arguments qui lui ont t fournis, ainsi que le premier de ces arguments.

Rponse 12.3
#!/bin/sh echo "J'ai reu $# arguments" echo "Le premier d'iceux est $1"

Qestion 12.4 Vous voulez crire un script qui vous dit combien de personnes sont logues sur une machine donne; par exemple :
drakkar ~ $ combien Rachid Il y a 5 personne(s) logues sur Rachid en ce moment. drakkar ~ $

Rponse 12.4 #!/bin/sh N=`who | wc -l | sed -e "s/ *//"` MACHINE=`whoami` echo "Il y a $N personne(s) logus sur $MACHINE en ce moment"

Qestion12 .5 On veut remplacer le suffixe .htm d'un ensemble de fichiers en .html.

Rponse 12.5 Le script suivant lanc avec "**/*.htm" comme paramtre devrait fonctionner :
#!/bin/sh for i in $@; do mv $i `echo $i | sed -e "s/htm$/html/"` done;

FILALI MOULAY RACHID

Page :

98

Question 12.6 Un ensemble de noms de fichiers sont en majuscules. On veut tout basculer en minuscules.

Rponse 12.6
#!/bin/sh for i in $@; do mv $i `echo $i | tr '[:upper:]' '[:lower:]'` done;

Question 12.7 Crez un script indice qui affiche l'indice de son premier argument dans la liste des arguments suivants. Par exemple,
indice toto tata titi toto tutu

renvoie l'indice de toto dans la liste tata titi toto tutu, c'est--dire 3.

Reponse 12.7
#!/bin/sh ARG=$1 shift N=0 for i in $@; do N=`expr $N + 1` [ x$ARG = x$i ] && echo $N done;

Question 12.8 On ne s'intresse ici qu' des fichiers contenant un mot par ligne. crire un script qui compte le nombre de mots contenant une des lettres r, s ou t, et parmi eux, ceux qui ont au moins deux telles lettres. On donnera aussi le nombre de mots ne contenant aucune voyelle. Cela donnera par exemple :
Dans ce fichier, vous avez : 45 mots contenant r, s ou t, et parmi eux, 12 contiennent deux de ces lettres au moins. Il y a aussi 10 mots ne contenant aucune voyelle.

FILALI MOULAY RACHID

Page :

99

Rponse 12.8
#!/bin/sh RST=`grep "[rst]" $1 | wc -l` DEUX=`grep "[rst].*[rst]" $1 | wc -l` CONS=`grep -v "[aeiou]" $1 | wc -l` (echo "Dans ce fichier, vous avez| :"; echo "$RST mots contenant r, s ou t et parmi eux,"; echo "$DEUX contiennent deux de ces lettres au moins."; echo "Il y a aussi $CONS mots ne contenant aucune voyelle.") | sed -e "2,3s/^ *// \$s/i */i /"

Exercice 12.1 Crer un script shell nomm "change" qui affichera la date de dernire modification d'un fichier puis la modifiera avec l'heure actuelle et enfin raffichera la date de dernire modification du fichier. Cette procdure acceptera 1 paramtre qui sera le nom du fichier. Lorsque vous excuterez "change mon_fic", le 8 octobre 15 heures 12 vous obtiendrez le rsultat: avant : -r--r--r-- 1 user group 40 Fev 3 2011 mon_fic aprs : -r--r--r-- 1 user group 40 Oct 8 15:12 mon_fic Exercice 12.2 Crer un script shell nomm "nombreJours" qui affichera le nombre de jours du mois courant. "nombreJours" affichera pour fvrier 2007 le message "28 jours en fvrier 2007". Exercice 12.3 Crer un script shell ralisant la cration d'un rpertoire "Exo3" contenant 10 fichiers nomms "Un" "Dix". Chaque fichier contient une seule ligne: * "Un" contient "Premire ligne" * "Deux" contient "Deuxime ligne" * ... * "Dix" contient "Dixime ligne" i. Vrifier que le rpertoire crer n'existe pas dj auquel cas il ne sera pas recr mais les fichiers si. Exercice 12.4 Crer un script shell qui ralise les oprations suivantes: * Cration sous votre rpertoire "TP2" d'un sous rpertoire nomm "annemoisjour" (20070202 pour le 2 fvrier 2007). * Copie des fichiers de "Exo3" sous ce rpertoire puis effacement de ces mmes fichiers de "Exo3". * Cration de deux fichiers sous le rpertoire d'accueil (HOME) de la personne qui a lanc le shell:

FILALI MOULAY RACHID

Page :

100

o un fichier nomm "Gros_fichier.numero_du_shell" dans lequel se trouvera le contenu concatn des fichiers traits o un fichier nomm "Nom_du_script.numero_du_shell" dans lequel se trouvera le nom des fichiers traits. i. Vrifier que le rpertoire crer n'existe pas dj. Exercice 12.5 * Crer un script permettant d'afficher la liste des fichiers du rpertoire /etc accessibles en lecture. * Crer un script permettant d'afficher la liste des fichiers du rpertoire /etc accessibles en criture. Exercice 12.6 Crer un script nomm "table" permettant d'afficher des tables de multiplication. "table 5 10" aura pour rsultat l'affichage: 0x5=0 1x5=5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 10 x 5 = 50

Rponse 12.1 AVANT=$(ls -l $1) touch $1 APRES=$(ls -l $1) echo "Avant : "$AVANT echo "Apres : "$APRES Rponse 12.2 MOIS=$(date +"%m") case $MOIS in 01) NOM="janvier";; 02) NOM="fevrier";; 03) NOM="mars";; 04) NOM="avril";; 05) NOM="mai";; 06) NOM="juin";; 07) NOM="juillet";; 08) NOM="aout";; 09) NOM="septembre";; 10) NOM="octobre";; 11) NOM="novembre";; FILALI MOULAY RACHID Page : 101

12) NOM="decembre";; esac ANNEE=$(date +"%Y") case $MOIS in 01|03|05|07|08|10|12) echo "31 jours en "$NOM" "$ANNEE;; 04|06|09|11) echo "30 jours en "$NOM" "$ANNEE;; 02) BISSEXTILITE=$(expr $ANNEE % 4) if [ $BISSEXTILITE != 0 ] then echo "28 jours en "$NOM" "$ANNEE else BISSEXTILITE=$(expr $ANNEE % 100) if [ $BISSEXTILITE != 0 ] then echo "29 jours en "$NOM" "*ANNEE else BISSEXTILITE=$(expr $ANNEE % 400) if [ $BISSEXTILITE != 0 ] then echo "28 jours en "$NOM" "$ANNEE else echo "29 jours en "$NOM" "$ANNEE fi fi fi;; esac Rponse 12.3 test -e Exo3 if [ $? != 0 ] then mkdir Exo3 fi echo "Premiere ligne" >Exo3/Un echo "Deuxieme ligne" >Exo3/Deux echo "Troisieme ligne" >Exo3/Trois echo "Quatrieme ligne" >Exo3/Quatre echo "Cinquieme ligne" >Exo3/Cinq echo "Sixieme ligne" >Exo3/Six echo "Septieme ligne" >Exo3/Sept echo "Huitieme ligne" >Exo3/Huit echo "Neuvieme ligne" >Exo3/Neuf echo "Dixieme ligne" >Exo3/Dix Rponse 12.4 FILALI MOULAY RACHID Page : 102

REP=$(date +"%Y%m%d") test -e $REP if [ $? != 0 ] then mkdir $REP fi cp Exo3/* $REP rm Exo3/* for file in $REP/* do cat $file >> ~/Gros_fichier.$$ echo $file >> ~/$0.$$ done Rponse 12.5 # script5a.bash for FILE in /etc/* do if test -r $FILE then echo $FILE fi done # script5b.bash############################################################## for FILE in /etc/* do if test -w $FILE then echo $FILE fi done Rponse 12.6 for V in $(seq 0 $2) do echo $V" x "$1" = "$(expr $V "*" $1 ) done

Bonne chance

FILALI MOULAY RACHID

Page :

103