diff --git a/unix/exercices/enchainer.tml b/unix/exercices/enchainer.tml new file mode 100644 index 0000000..2801b0b --- /dev/null +++ b/unix/exercices/enchainer.tml @@ -0,0 +1,356 @@ + + + + + Pipes + + + + +

Pipes, jokers et redirections

+ + +

La commande cat

+ + +

On n'a pas traité de la commande cat dans la page consacrée aux +commandes de base, parce que cat s'utilise le plus souvent avec des +redirections.

+ +
    + +
  1. &icone.solution; + +Comment visualiser deux fichiers l'un après l'autre à l'aide de la commande +cat ?
  2. + +
  3. &icone.solution; + +Comment faire une copie d'un fichier sans utiliser cp ni ouvrir +d'éditeur de texte ?
  4. + +
  5. &icone.solution; + +Utiliser cat pour écrire un peu de texte et mettre le résultat +dans un fichier notes.
  6. + +
  7. &icone.solution; + +Quelle différence 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 ?

  8. + +
  9. &icone.solution; + +Comment obtenir un fichier blo qui corresponde à un fichier +bla dont les lignes seraient désormais numérotées ?
  10. + +
+ +

Jokers et expressions régulières

+ +
    + +
  1. &icone.solution; + +Vous avez chez vous des fichiers appelés essai1, essai2, +essai3 et essai4. Comment les effacer en une seule ligne +de commande ?
  2. + +
  3. &icone.solution; + +Dans mon répertoire d'accueil, j'ai un certain nombre de fichiers avec un +suffixe .c. Je désire les regrouper dans un répertoire que +j'appelerai C/. Quelles sont les commandes que je dois +taper ?
  4. + + +
  5. &icone.solution; + +Vous désirez regrouper dans un répertoire Rangement les fichiers +dont le nom contient un caractère minuscule suivi d'un caractère majuscule. +Quelle(s) est/sont la/les commande(s) à donner ?
  6. + + +
  7. &icone.solution; + +Même chose avec les fichiers dont le nom contient trois voyelles à la +suite.
  8. + + +
  9. &icone.solution; + +En utilisant ls et grep, affichez la liste des fichiers +dans /bin dont le nom : + +
  10. + +
  11. &icone.solution; + +Comment éliminer les lignes vides dans un fichier ? Comment éliminer +les lignes ne contenant que des blancs ?
  12. + +
+ + + + +

Exercices sur Germinal

+ + +
    + +
  1. &icone.solution; + Combien de +fois le mot «mine» apparaît dans chaque chapitre de la première partie de +Germinal ?
  2. + +
  3. &icone.solution; +Combien y +a-t-il de lignes blanches dans zola1.txt ?
  4. + +
+ + +

head et tail

+ + +
    + +
  1. &icone.solution; + Affichez +les 15 premières lignes du fichier /etc/hosts, les 15 dernières +lignes, toutes les lignes à partir de la quinzième, les lignes 15 à 20. + +
    +

    &icone.attention; Attention &icone.attention;

    +Placez-vous sur clipper pour faire cet exercice. En effet, les +/etc/hosts des autres machines sont beaucoup plus petits (en +particulier peuvent faire moins de 15 lignes). +
  2. + +
  3. &icone.solution; + Récupérer +les lignes 5 à 9 d'un fichier de 12 lignes.
  4. + + + +
  5. &icone.solution; + Comment +afficher la cinquième ligne d'un fichier ?
  6. + +
+ + + +

Filtres et redirections

+ + +
    + + +
  1. &icone.solution; + +Créez un fichier dont chaque ligne commence par un chiffre, suivi d'un +slash (/), puis d'un ou plusieurs mots. + +
      + +
    1. Affichez les lignes de ce fichier triées en ordre croissant, suivant +le nombre placé en début de ligne;
    2. + +
    3. Éliminez de chaque ligne le chiffre et le caractère «/»;
    4. + +
    5. Triez ces lignes par ordre alphabétique inverse.
    6. + +
  2. + +
  3. &icone.solution; + Combien de +fichiers de configuration avez-vous ?
  4. + + +
  5. &icone.solution; + Combien de +répertoires de configuration avez-vous ?
  6. + +
  7. &icone.solution; + +Comment mettre dans un fichier la liste de tous les fichiers de +l'arborescence à partir du répertoire courant ?
  8. + + +
  9. &icone.solution; + Créez un +fichier liste contenant la liste de tous vos fichiers, avec leur +taille, leurs droits, etc.
  10. + + + +
  11. &icone.solution; + +Comment afficher uniquement les fichiers du répertoire courant qui sont des +liens symboliques ?
  12. + + +
  13. &icone.solution; + Combien de +lignes contiennent le mot «file» dans la page de man de +syst ?
  14. + +
  15. &icone.solution; + Quels sont les +dix plus gros fichiers de /usr/bin/ ?
  16. + + +
  17. &icone.solution; + +Pour chaque ligne du fichier /etc/hosts, affichez : + +
  18. + +
+ + + + +

Exercices sur les pages jaunes

+ + + +
    + +
  1. &icone.solution; +Combien de +personnes de la promotion 1996 ont un login commençant par «l» ?
  2. + +
  3. &icone.solution; +Est-ce que des +gens des promotions de la décennie 1980 ont encore un compte sur clipper ?
  4. + +
  5. &icone.solution; +Combien y a-t-il +de comptes d'élèves, magistériens, etc (appartenant à une promotion) sur +clipper ?
  6. + +
  7. &icone.solution; +Classer les +comptes de ces utilisateurs par numéro d'UID.
  8. + +
  9. &icone.solution; + +Affichez le login des personnes ayant zsh comme shell de login.
  10. + +
  11. &icone.solution; + +Affichez le nom et le prénom des personnes ayant un compte sur +clipper, et dont le nom de famille contient au moins 2 voyelles +côte à côte. Compter ces personnes.
  12. + + + + +
+ + + +

Divers

+ +
    + +
  1. &icone.solution; + +Comment conserver les informations concernant le disque dans un +fichier ?
  2. + +
  3. &icone.solution; + +Comment connaître la dernière date de connexion au système d'un utilisateur +de login martin ?
  4. + + + +
  5. &icone.solution; + +Affichez le type des fichiers /etc/passwd, +/usr/include/stdio.h, /bin/ls et de votre répertoire de +travail.
  6. + +
+ +
+ Auteur : Anonyme, Joël Riou. Dernière modification le 2002-12-08. +
+ + + + + diff --git a/unix/exercices/grep.tml b/unix/exercices/grep.tml index 10aa6d0..fa1f1cb 100644 --- a/unix/exercices/grep.tml +++ b/unix/exercices/grep.tml @@ -10,23 +10,22 @@

Exercices sur grep

-

-Ces exercices sont des questions de cours : les solutions se trouvent -toutes dans les pages de man des commandes en question. On suppose donc -connues les commandes de less, qui servent à se déplacer dans les pages de man... -Testez les commandes sur des fichiers et répertoires d'essai pour vous faire -la main et comprendre ce qui se passe. Pour une présentation élémentaire de -grep, vous pouvez aller lire le cours. -

+

Ces exercices sont des questions de cours : les solutions se +trouvent toutes dans les pages de man des commandes +en question. On suppose donc connues les commandes de less, qui +servent à se déplacer dans les pages de man... Testez les commandes sur +des fichiers et répertoires d'essai pour vous faire la main et comprendre +ce qui se passe. Pour une présentation élémentaire de grep, +vous pouvez aller lire le cours.

Pour voir la solution, cliquer sur le bouton &icone.solution;.

--

Les options de grep

+

Les options de grep

diff --git a/unix/exercices/index.tml b/unix/exercices/index.tml index c5f08d3..80d87f3 100644 --- a/unix/exercices/index.tml +++ b/unix/exercices/index.tml @@ -62,18 +62,9 @@ Les corrig
  • find
  • -
    -

    Les exercices qui suivent n'ont pas encore été remis à -jour !

    -
    -

    Pipes, redirections et expansion des noms de fichiers

    -

    Une partie des exercices de cette section ne sont pas encore corrigés -(dernier exercice des filtres et redirections, deux exercices à propos -des pages jaunes).

    -
    1. La commande cat
    2. Jokers et expressions @@ -88,6 +79,11 @@ r
    +
    +

    Les exercices qui suivent n'ont pas encore été remis à +jour !

    +
    +

    Système

    diff --git a/unix/exercices/less.tml b/unix/exercices/less.tml index 5a7a97f..3adee72 100644 --- a/unix/exercices/less.tml +++ b/unix/exercices/less.tml @@ -20,50 +20,50 @@ tuteurs
    .
      -
    1. &icone.solution; +
    2. &icone.solution; Comment fait-on pour obtenir une page d'aide avec less ?
    3. -
    4. &icone.solution; +
    5. &icone.solution; Comment examiner plusieurs fichiers à la suite ? Comment passe-t-on au suivant ? Comment revient-on au précédent ?
    6. -
    7. &icone.solution; +
    8. &icone.solution; Quelles sont les commandes différentes qui permettent de quitter less ?
    9. -
    10. &icone.solution; +
    11. &icone.solution; Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la ligne n ?
    12. -
    13. &icone.solution; +
    14. &icone.solution; Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la première ligne où apparaît un motif donné ?
    15. -
    16. &icone.solution; +
    17. &icone.solution; Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement après et avant la position courante ?
    18. -
    19. &icone.solution; +
    20. &icone.solution; Comment dire à less de chercher le mot à partir de la première ligne du fichier, et ce où que l'on soit dans le fichier ?
    21. -
    22. &icone.solution; +
    23. &icone.solution; 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 caractères ?
    24. -
    25. &icone.solution; +
    26. &icone.solution; Quelles sont les commandes qui permettent d'aller à la prochaine (resp. précédente) occurence du motif recherché à travers tous les fichiers édités ?
    27. -
    28. &icone.solution; +
    29. &icone.solution; Comment chercher dans un fichier le caractère / ?
    30. diff --git a/unix/exercices/mkdir_cd.tml b/unix/exercices/mkdir_cd.tml index 2bcc02a..491fc3a 100644 --- a/unix/exercices/mkdir_cd.tml +++ b/unix/exercices/mkdir_cd.tml @@ -62,7 +62,7 @@ Que faut-il faire
    31. &icone.solution; - Est-ce que rmdir peut prendre des + Est-ce que mkdir peut prendre des options ?
    32. &icone.solution; @@ -86,10 +86,10 @@ droits
    33. &icone.solution; - Quel est l'effet de la commande suivante :
    34. + Quel est l'effet de la commande suivante :
      rmdir -p toto/tata/tutu/
      -
      +
    35. &icone.solution; diff --git a/unix/exercices/solutions/cp_mv-sol.tml b/unix/exercices/solutions/cp_mv-sol.tml new file mode 100644 index 0000000..268abb0 --- /dev/null +++ b/unix/exercices/solutions/cp_mv-sol.tml @@ -0,0 +1,262 @@ + + + + + cp et mv + + + +

      Corrigé des exercices sur cp et mv

      + + +

      +Ces exercices sont des questions de cours : les solutions se trouvent +toutes dans les pages de man des commandes en question. On suppose donc +connues les commandes de less, qui servent à se déplacer dans les +pages de man... et la commande servant à chercher un mot. Testez les +commandes sur des fichiers et répertoires d'essai pour vous faire la main et +comprendre ce qui se passe. +

      + +

      cp

      + + + +
        + + +
      1. Est-il possible de faire une copie d'un répertoire +et de l'ensemble de ses sous-répertoires en une seule ligne de +commande ? + +

        +Oui, c'est à cela que sert l'option -r (recursive). +Supposons, suivant l'arborescence d'exemple, +que vous voulez copier le répertoire Rapport et ses +sous-répertoires dans le répertoire www. Il faut +taper :

        + +
        +cp -r Rapport/ www/
        +
        +

        +ou +

        + +
        +cp -R Rapport/ www/
        +
      2. + +
      3. Que se passe-t-il si l'on veut faire une copie +appelée tentative/ de son répertoire essai/, et que +le répertoire tentative/ existe déjà ? + +

        Quand on indique le nom d'un répertoire qui n'existe pas, cp +considère qu'il s'agit du nom à donner à la copie du premier répertoire (ou +fichier). Quand le répertoire existe déjà, cp considère qu'il +s'agit de l'endroit où il faut placer la copie du premier élément (la +«cible» : target).

        + +

        +Si donc on tape +

        +
        +cp -R essai/ tentative/
        +
        +

        +et que tentative/ existe déjà, on obtient une copie de +essai/, également appelée essai/, placée dans le +répertoire tentative/. +

        +
      4. + +
      5. Que se passe-t-il si vous voulez faire une copie +d'un fichier dans un répertoire où il existe déjà un fichier de ce +nom ? + +

        +Le programme demande si vous voulez vraiment effacer le fichier déjà existant +pour le remplacer par celui dont vous faites la copie. +

        + +
        +

        &icone.attention; Attention &icone.attention;

        +

        Il en est +ainsi parce que vous avez un alias de cp sur cp -i, +qui demande confirmation. Ce n'est pas nécessairement le cas partout. +

        + +

        &icone.note;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).

        +
      6. + +
      7. Quel est l'effet d'une ligne comme : + +
        +cp fichier1 fichier2 fichier3 repertoire/
        +
        + +

        +Les fichiers fichier1, fichier2 et +fichier3 sont copiés sous leur nom dans le répertoire +répertoire/, qui doit exister. +

        +
      8. + +
      + +

      mv

      + +
        + +
      1. Que se passe-t-il si le fichier «cible» existe +déjà ? +

        +Si vous avez un alias de mv sur mv -i (cas de la +config conscrits), le programme demande si vous voulez réécrire le fichier +cible en remplaçant son contenu par celui du fichier de départ : +

        + + +
        +bireme ~ $ ls
        +rapport.tex     notes     complements
        +bireme ~ $mv notes complements
        +mv: overwrite complements (yes/no)? y
        +bireme ~ $ls
        +rapport.tex     complements
        +
        +
      2. + +
      3. Supposez que vous avez chez vous l'arborescence que voici, et que vous vous trouvez dans +~/Rapport/docs/. + +
          + +
        • Comment faites-vous pour y amener Rapport.tex qui +se trouve dans le répertoire père ? +
          +mv ../Rapport.tex .
          +
          + +

          Amener le fichier Rapport.tex situé dans répertoire père +(../Rapport.tex) dans le répertoire où on se trouve +(. : ici). +

        • + +
        • Comment faites-vous ensuite pour ramener ce fichier à son +emplacement d'origine ? + +
          +mv Rapport.tex ..
          +
          + + +

          Amener le fichier Rapport.tex situé dans le répertoire courant, +dans le répertoire père (..).

        • + +
        +
      4. + +
      5. Comment renommer un répertoire +bla/ en blo/ ? Que se passe-t-il si le +répertoire blo existe déjà ? + + +

        Il suffit de taper +

        + +
        +mv bla/ blo/
        +
        + +

        +Si jamais blo/ existe déjà, bla/ devient un +sous-répertoire de blo/. +

        +
      6. + +
      7. Comment faire pour à la fois déplacer un fichier +et changer son nom ? Que se passe-t-il si il existe déjà un fichier de +ce nom dans le répertoire d'arrivée ? + +

        +Supposons que l'on veut amener Rapport.tex dans le répertoire +courant, et l'appeler stage. On tape : +

        + +
        +mv ../Rapport.tex stage
        +
        + +

        +Rapport.tex est à la fois déplacé et renommé; vous pouvez +vérifier qu'il n'est plus dans Rapport et qu'il y a désormais un +fichier stage dans docs/. +

        + +

        +Si le fichier d'arrivée existe déjà, on se retrouve dans le cas vu tout au +début de cet exercice (remplacement ou non). +

        +
      8. + + +
      9. Mêmes questions avec un répertoire . + + +

        Pour déplacer et renommer, la syntaxe est la même que pour un fichier : +

        + +
        +mv ../bla ble/
        +
        + +

        +déplace le répertoire bla/ du répertoire père dans le répertoire +courant, et le renomme en ble/. Si jamais ble/ +existe déjà, bla/ y est déplacé sous son nom, et devient un +sous-répertoire de ble/. +

        +
      10. + + +
      11. Que se passe-t-il si on lance mv +avec les options -i et -f ensemble ? +. + +

        +L'option -f (force) sert à renommer le fichier +impérativement, même si le fichier cible existe déjà, sans demander +confirmation. L'option -i (interactive) demande +confirmation. Des deux options, c'est -f qui l'emporte : +

        + +
        +bireme ~ $ ls
        +bla	tutu	Rapport/
        +bireme ~ $ alias mv
        +mv='mv -i'
        +bireme ~ $ mv bla tutu
        +mv: overwrite tutu (yes/no)? n
        +bireme ~ $ mv -f bla tutu
        +bireme ~ $ ls
        +tutu    Rapport/
        +
        +
      12. + +
      + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + diff --git a/unix/exercices/solutions/enchainer-sol.tml b/unix/exercices/solutions/enchainer-sol.tml new file mode 100644 index 0000000..afeafe3 --- /dev/null +++ b/unix/exercices/solutions/enchainer-sol.tml @@ -0,0 +1,1207 @@ + + + + + Pipes + + + + +

      Pipes, jokers et redirections : corrigés

      + +

      La commande cat

      + + + +
        + +
      1. Comment visualiser deux fichiers l'un après +l'autre à l'aide de la commande cat ?

        + +Il suffit de taper les deux noms de fichiers à la suite; par exemple, pour +visualier bla puis blo, on tape :

        + +
        +cat bla blo
        +
      2. + + +
      3. Comment faire une copie d'un fichier sans +utiliser cp ni ouvrir d'éditeur de texte ? + +

        +On demande à cat d'afficher le contenu d'un fichier, puis de placer +le résultat dans un fichier :

        + +
        +cat toto > copie 
        +
      4. + + + + +
      5. Utiliser cat pour écrire un peu de +texte et mettre le résultat dans un fichier notes. + +

        +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 : +

        + +
        +galion ~ $ ls
        +maitrise.tex
        +galion ~ $ cat > notes
        +Faire la bibliographie
        +Revoir le chapitre 1.
        +^D
        +galion ~ $ ls
        +maitrise.tex    notes
        +galion ~ $ cat notes
        +Faire la bibliographie
        +Revoir le chapitre 1.
        +galion ~ $
        +
        + +

        +C'est bien sûr un moyen un peu spartiate pour écrire du texte, mais dans le +cas de choses très courtes dans ce style, ce peut être plus rapide que de +lancer un véritable éditeur. +

      6. + + +
      7. Quelle différence 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 

        +concatène les deux fichiers bla et +blo, et place le résultat dans un nouveau fichier appelé +blu. Si blu existe déjà, le shell affiche un message +d'erreur et ne fait rien.

        + +

        +cat bla blo >> blu place la concaténation de bla et +blo à la fin d'un fichier blu déjà existant. S'il n'existe +pas, le shell affiche un message d'erreur et en reste là, sans créer de +fichier blu.

        + +

        +Les deux redirections ne sont donc pas du tout équivalentes, mais leur action +dépend du shell, qui a des options qui modifie leur comportement par défaut. +

      8. + +
      9. Comment obtenir un fichier blo qui +corresponde à un fichier bla dont les lignes seraient désormais +numérotées ? + + +

        +Il faut utiliser l'option -n de cat. Par exemple : +

        + +
        +galion ~ $ cat bla
        +Pomme
        +Poire
        +Prune
        +galion ~ $ cat -n bla > blo
        +galion ~ $ cat blo
        +     1  Pomme
        +     2  Poire
        +     3  Prune
        +galion ~ $
        +
      10. + +
      + + +

      Jokers et expressions régulières

      + + + + +
        + +
      1. Vous avez chez vous des fichiers appelés +essai1, essai2, essai3 et essai4. Comment +les effacer en une seule ligne de commande ? + +

        +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 +façons de faire : +

        + +
          + +
        • rm essai[1234] : les crochets signifient «l'un des caractères +qui se trouvent entre crochets»;
        • + + +
        • rm essai[1-4] : c'est le même principe, sauf que l'on indique un +intervalle au lieu d'écrire explicitement les chiffres;
        • + + +
        • rm essai? : le point d'interrogation désigne n'importe quel +caractère 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). + +

          +Ici, on trouvera tous les fichiers commençant par essai, suivi d'un +unique caractère qui peut ne pas être un chiffre.

          +
        • + +
        • 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 indéfini de caractères, ou aucun.
        • +
      2. + + +
      3. Dans mon répertoire d'accueil, j'ai un +certain nombre de fichiers avec un suffixe .c. Je désire les +regrouper dans un répertoire que j'appelerai C/. Quelles sont les +commandes que je dois taper ? + +

        +On commande par créer un répertoire C avec mkdir, puis, avec +mv, on déplace tous les fichiers ayant un suffixe . et +dont le nom est fait d'une suite de caractères quelconques : +

        + + +
        +galion ~ $  ls
        +hello*    zoinx*
        +hello.c   zoinx.c
        +galion ~ $  mkdir C
        +galion ~ $  mv *.c C/
        +galion ~ $  ls
        +C/        hello*     zoinx*
        +galion ~ $  ls C/
        +hello.c   zoinx.c
        +
        +
      4. + +
      5. Vous désirez regrouper dans un répertoire +Rangement les fichiers dont le nom contient un caractère minuscule +suivi d'un caractère majuscule. Quelle(s) est/sont la/les commande(s) à +donner ? + +

        +On commence par créer le répertoire Rangement avec mkdir. +Pour désigner 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 caractères», puis faire de même avec les majuscules. Mais on +gagne du temps en utilisant des intervalles ([a-z] et +[A-Z]). Le reste du nom du fichier, avant et après la minuscule puis +la majuscule, est indéfini. On écrit donc : +

        + + + +
        +galion ~ $ mkdir Rangement
        +galion ~ $ mv *[a-z][A-Z]* Rangement/
        +
        +
      6. + + + +
      7. Même chose avec les fichiers dont le nom +contient trois voyelles à la suite. + +

        +Le principe est le même, sauf que l'on indique explicitement les voyelles +entre crochets : +

        + + +
        +galion ~ $ mkdir Rangement
        +galion ~ $ mv *[aeiou][aeiou][aeiou]* Rangement/
        +
        +
      8. + +
      9. En utilisant ls et grep, +affichez la liste des fichiers dans /bin dont le nom correspond à un +motif donné. + +

        +On peut procéder de deux façons : utiliser ls seul et des jokers, ou +rediriger ls dans grep et utiliser les expressions +régulières de grep. +

        + +
        +

        &icone.attention; Attention &icone.attention;

        +

        Dans la suite du corrigé, on suppose que l'on se trouve déjà dans +/bin/.

        + +

        On met des apostrophes autour des expressions de +grep pour les protéger contre le shell. Enfin, on ne détaille pas les +expressions régulières; à noter ces points importants à propos de +grep :

        + + +
          + +
        • Le chapeau (^) en début d'expression désigne le début de la +ligne;
        • + +
        • Le dollar en fin d'expression désigne la fin de la ligne;
        • + +
        • Le point désigne n'importe quel caractère;
        • + +
        • L'étoile signifie «zéro ou plus de fois le caractère qui précède»; c'est +un multiplicateur;
        • + +
        • Comme avec les jokers du shell, [^m] veut dire «sauf le +caractère m».
        • + +
        +
        + +

        +On constate que grep est plus complexe mais bien plus puissant que +les jokers du shell. +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Avec ls seul Avec ls et grep
        Commence par «a» et dont la deuxième lettre est «s» ou «t» ls a[st]* ls | grep '^a[st].*'
        Contient «un» et se termine par «t» ls *un*t ls | grep '.*un.*t$'
        Contient «gre» ou «st» ls *(gre|st)* ls | grep '\(gre\|st\)'
        Contient exactement deux lettres «m» ls | grep '[^m]*m[^m]*m[^m]*'
        Contient au moins deux lettres «m» ls | grep '.*m.*m.*'
        Contient au moins quatre caractères et aucun chiffre ls | grep '^[^0-9]\{4,\}$'
        Est constitué de deux lettres exactement ls ?? ls | grep '^..$'
        Commence et finit par un chiffre ls [0-9]*[0-9] ls | grep '^[0-9].*[0-9]$'
        +
      10. + +
      11. Comment éliminer les lignes vides dans un +fichier ? Comment éliminer les lignes ne contenant que des blancs ? +Comment éliminer toutes les lignes blanches ? + +

        +Une ligne vide est différente d'une ligne ne contenant +que des blancs, c'est-à-dire des espaces ou des tabulations, même si pour un +oeil humain cela revient au même. La commande de recherche sera différente +selon le cas : +

        +
          + +
        • Lignes vides : c'est «rien entre le début et la fin de +la ligne»; on écrit donc : +
          grep '^$' fichier
        • + + +
        • Lignes ne contenant que des blancs : on utilise une +classe de caractère préexistante : [: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 remplaçant éventuellement le motif par '^$' ou +^[[:space:]]$' selon que l'on veut ôter les lignes vides ou les +lignes contenant des blancs. +

      12. +
      + + + + + + + +

      Exercices sur Germinal

      + + +
        + +
      1. Combien de fois le mot «mine» apparaît dans +chaque chapitre de la première partie de Germinal ?

        + + +On cherche la chaîne de caractère «mine», qui soit un mot, éventuellement +suivi d'un «s». On va donc désigner le début du mot avec le symbole +\<, la fin du mot avec le symbole \>, et le «s» +optionnel avec le point d'interrogation. On veut aussi faire apparaître le +nombre d'occurences du mot, dans chaque fichier du répertoire zola, +avec l'option -c de grep.

        + +

        +Les noms des fichiers de Germinal sont de la forme +zola1.txt, de 1 à 6. Pour chercher dans tous les fichiers de cette +sorte, on peut écrire, au choix (attention à ne pas confondre les +wildcards du shell avec les expressions régulières de grep). +

        + +
          + +
        • zola*.txt (un ou plusieurs caractères entre zola et +.txt).
        • + +
        • *.txt (tous les fichiers .txt du répertoire, mais il +pourrait y en avoir d'autres que zola*.txt).
        • + +
        • zola?.txt (un seul caractère entre zola et le +suffixe).
        • + +
        • zola[1-6].txt (un chiffre entre 1 et 6 inclus entre +zola et le suffixe).
        • + +
        + +

        +On peut donc écrire : +

        + +
        grep -c '\<mines?\>' *.txt
        + + +

        Et on obtient :

        + +
        +zola1.txt:5
        +zola2.txt:0
        +zola3.txt:3
        +zola4.txt:3
        +zola5.txt:1
        +zola6.txt:2
        +
        + +

        +Attention : les chiffres indiqués correspondent au nombre de lignes où figure +le mot «mine», mais pas au nombre réel d'occurences du mot. Pour un mot précis +comme celui-ci, la marge d'erreur est faible, mais si vous cherchez un article +défini, par exemple, cette méthode est insuffisante. C'est là qu'un langage +comme Perl est très utile. +

      2. + + +
      3. Combien y a-t-il de lignes blanches dans +zola1.txt ?

        + Une ligne blanche, c'est rien entre un début de ligne +et une fin de ligne, ou alors une ligne ne contenant que des espaces et des +tabulations. On va donc chercher toutes les lignes correspondant à ce schéma +(voir plus haut pour ces questions de définitions). +Comme il y a deux motifs à chercher, on utilise l'expression régulière qui +permet de chercher un motif ou un autre :

        + +
        \(motif1\|motif2\)
        + + + +

        +La commande à taper est : +

        + +
        grep  '\(^[[:space:]]$\|^$\)' zola1.txt
        + +

        +Ensuite, on veut compter le nombre de lignes ainsi produites par +grep, avec la commande wc (word count); on va +utiliser l'option -l (lines, lignes). On tape donc : +

        + +
        grep '\(^[[:space:]]$\|^$\)' zola1.txt | wc -l
        + +

        +Et on obtient «81». Bien évidemment, on aurait pu se rappeler que l'option +-c de grep donne le nombre de lignes matchant la chaîne +recherchée, et obtenir le même résultat en ne lançant qu'un seul processus... +

      4. + +
      + +

      head et tail

      + + +
        + + + +
      1. Affichez les 15 premières lignes du fichier +/etc/hosts, les 15 dernières lignes, toutes les lignes à partir de la +quinzième, les lignes 15 à 20.

        + +À propos du fichier /etc/hosts : les ordinateurs sur +l'Internet sont désignés par une adresse IP, constituée de 4 nombres entre 0 +et 255 séparés par des points. C'est cette adresse IP qui permet à un +ordinateur d'envoyer un message (datagramme IP) à un autre. +

        + +

        +Cependant, mémoriser 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 séparées par des points (par exemple, +research.att.com). +

        + +

        +Le mécanisme de conversion d'un nom en adresse IP (ou le mécanisme inverse) +s'appelle la «résolution de noms». Elle se fait normalement par +l'intermédiaire de nameservers, ordinateurs sur lequel tourne le +programme BIND, qui se chargent de répondre aux questions de résolution de +noms. +

        + +

        +Cependant, pour certaines machines très communément accédées depuis un +ordinateur donné (par exemple, les machines de la même salle) ou bien +pour éviter d'avoir à configurer un nameserver, on préfère parfois +utiliser le fichier /etc/hosts : celui-ci définit un certain nombre +de conversions nom -> adresse IP qui seront consultées avant les +nameservers.

        + +

        +La bibliothèque qui se charge de faire la traduction, et qui consulte d'abord +le /etc/hosts puis les nameservers, s'appelle la +libresolv.

        + + +
          + +
        • Afficher les 15 premières lignes de /etc/hosts : +
          head -15 /etc/hosts
        • + +
        • Afficher les 15 dernières lignes de /etc/hosts : +
          tail -15 /etc/hosts
        • + +
        • Afficher toutes les lignes à partir de la quinzième : +
          tail +15 /etc/hosts
        • + +
        • Affichez les lignes 15 à 20 : +
          head -20 /etc/hosts | tail -6 
        • +
        + +
      2. + +
      3. Récupérer les lignes 5 à 9 d'un fichier de 12 +lignes

        + + +Il y a deux solutions : +

        + +
          + +
        1. Prendre les neuf premières lignes, et n'en garder que les cinq dernières +(de 5 à 9 inclus) : + +
          head -9 fichier | tail -5
          +
        2. + +
        3. Prendre les 8 dernières lignes (de 5 à 12 inclus) et n'en garder que +les 5 premières : +
          tail -8 fichier | head -5
          +
        4. + +
      4. + +
      5. Comment afficher la cinquième ligne d'un +fichier ? + +

        +On utilise la commande head pour extraire les cinq premières +lignes du fichier, puis la commande tail pour ne conserver que la +dernière des cinq :

        + + +
         head -5 fichier | tail -1 
        + + + +
      6. +
      + + +

      Filtres et redirections

      + +
        + + +
      1. Créez un fichier dont chaque ligne commence +par un chiffre, suivi d'un slash (/), puis d'un ou plusieurs mots. + +

        +C'est la commande sort qui permet de trier des fichiers selon un +ordre donné.

        + +
          + +
        1. Affichez les lignes de ce fichier triées en ordre croissant, +suivant le nombre placé en début de ligne

          +sort sans option trie automatiquement en fonction du premier caractère, +par ordre alphabétique si c'est une lettre, par ordre croissant si ce sont des +chiffres. Il suffit donc de taper : +

          +
          sort fichier
          +
        2. + +
        3. Éliminez de chaque ligne le chiffre et le caractère +«/».

          Pour cela, sans utiliser d'éditeur, on peut +utiliser la commande cut, qui élimine des champs dans une ligne. Par +défaut, le séparateur de champs est une tabulation. Ici, on peut demander à +cut de considérer le slash comme un séparateur de champs (option +-d, «délimiteur»), et de ne conserver que le deuxième champ du +fichier (option -f, field). On redirige ensuite la sortie +dans un autre fichier :

          + +
           cut -d/ -f2 fichier > fichier2
          +
        4. + + + +
        5. Triez ces lignes par ordre alphabétique inverse. +C'est l'option -r (reverse) de sort qui inverse le +résultat de la comparaison. Par défaut, sort trie par ordre +alphabétique, il suffit donc de taper : + +
          sort -r fichier2
        6. + +
        +
      2. + +
      3. Combien de fichiers de configuration avez-vous +? + +

        +La réponse n'est pas simple, car vous avez également des répertoires de +configuration, comme .netscape/ qui contient entre autres vos +marque-pages (bookmarks.html), vos préférences +(preferences), etc. On va compter le nombre de fichiers commençant +par un point situés dans votre répertoire principal, en éliminant les copies +de sauvegarde (qui finissent par un tilde). Il y a plusieurs manières de +procéder.

        + +
          + +
        1. 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 répertoires 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 répétition d'un caractère spécifié; on +met des apostrophes autour de l'espace pour qu'il soit compris comme tel et +non comme un simple espace : +

          + +
          tr -s ' ' 
          + +

          +On utilise cut pour conserver le dernier champ avec les noms de +fichiers (en l'occurence le neuvième champ), en indiquant que l'espace sert de +délimiteur de champ :

          + +
           cut -d' ' -f9 
          + +

          +Enfin, on demande à grep de ne retenir que les fichiers commençant +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... :-) +

        2. + + +
        3. ls et grep

          Il y a plus simple... On demande à +ls une liste des fichiers commençant par un point (avec l'option +-d pour ne pas descendre dans les répertoires de configuration), on +ne garde que les lignes ne finissant pas par un / ou un tilde, et on +compte :

          + +
          ls -ad .* | grep -vc '\(~\|/\)$' 
          +
        4. + + +
        5. find +

          +On demande à find de chercher dans le répertoire 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 préférable car elle ne lance que deux processus et non pas +au moins cinq comme la précédente. +

        6. + +
        +
      4. + +
      5. Combien de répertoires de configuration avez-vous +?

        + + +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 même que dans l'exercice précédent. La différence est que +grep va chercher les lignes qui commencent par un point +et finissent par un slash. Cela se fait de la manière +suivante :

          + +
          grep '^\..*/$'
          + +

          +.* signifie «n'importe quel caractère (point) répété zéro ou +plusieurs fois (étoile)». +

          + +

          +On tape donc :

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

          +On part ici du principe que vous avez un alias de ls sur ls +-F (qui met un slash après les noms de répertoires, une étoile après les +noms d'exécutables et une arobase après les noms de liens). Si ce n'est pas le +cas, ajoutez-le dans un fichier .alias ou tapez ls -lF. +

        2. + + +
        3. find + +

          +On demande à find de chercher tous les fichiers de type «répertoire» +(-type d : directory), et dont le nom commence par un point +(-name '.*', les quotes servant à protéger du shell le contenu de +l'expression), dans descendre dans l'arborescence. +

          + +

          +On tape donc :

          + +
          find . -maxdepth 1 type d -name '.*'  | wc -l
          +
        4. + +
        + +

        +Il y a une inexactitude dans le résultat : find compte aussi +./ dans le résultat. +

      6. + + + + +
      7. Comment mettre dans un fichier la liste de +tous les fichiers de l'arborescence à partir du répertoire courant ? +

        + +C'est l'option -R de ls qui permet d'afficher +récursivement le contenu d'un répertoire et de ses sous-répertoires (à ne +pas confondre avec -r qui inverse le tri). Pour rediriger la +sortie d'une commande dans un fichier, on utilise le caractère +>. Pour mettre la liste de tous les fichiers de l'arborescence +dans un fichier toto, il faut donc taper :

        + +
         ls -R > toto 
        +
      8. + + + +
      9. Créez un fichier liste contenant la +liste de tous vos fichiers, avec leur taille, leurs droits, etc +

        +Il va s'agir de faire une liste récursive de l'ensemble de votre compte +(option -R de ls), incluant les fichiers de configuration +(option -a) et les renseignements donnés 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 répertoires). On +va donc demander à grep de chercher toutes les lignes commençant par +un tiret. +

        + +

        +Enfin, on va placer le résultat dans un fichier appelé liste. On tape +donc :

        + +
        ls -alR | grep '^-' > liste
        +
      10. + +
      11. Comment afficher uniquement les fichiers +du répertoire courant qui sont des liens symboliques ? +

        + +L'option -l de ls donne une liste longue des fichiers, +incluant les droits et le type des fichiers, identifiés par une +lettre : rien pour un fichier, «d» pour un répertoire +(directory), «l» pour un lien (link); par exemple : +

        + +
        +drwxr-xr-x   2 emilia   users        1024 mai 10 02:27 www/
        +
        + +

        +Pour obtenir la liste des fichiers du répertoire 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», grâce à la commande +grep. On utilise une expression régulière pour cela : le +chapeau (^) désigne le début de la ligne, et l'ensemble de +l'expression est placée entre apostrophes pour qu'elle ne soit pas +interprétée par le shell. On tape donc : +

        + + +
        ls -l | grep '^l' 
        +
      12. + + + + + +
      13. Combien de lignes contiennent le mot +«file» dans la page de man de less ?

        + + +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 +chaîne de caractères file, mais pas le nombre d'occurences du mot +dans le fichier : il pourrait y avoir plusieurs fois file sur la même +ligne. On atteint là encore la limite de ce que sait faire grep. +

      14. + +
      15. Quels sont les dix plus gros fichiers de +/usr/bin/ ? + + + + +

        +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 cinquième champ, celui de la taille, qui nous intéresse. La +numérotation commençant à 0 (comme les étages), pour indiquer le cinquième +champ on écrit +4. Ensuite, on veut que le tri se fasse selon un +critère numérique (option -n) et à l'envers, en commençant par les +plus grandes valeurs (option -r, reverse). +

        + +

        +Pour finir, on veut les dix premières lignes du résultat. On les sélectionne +avec la commande head; par défaut, elle prend les dix premières +lignes d'un fichier, il n'est donc pas nécessaire de préciser le nombre de +lignes voulues. Finalement, on écrit : +

        + +
        ls -l /usr/bin | sort -nr +4 | head
        +
      16. + +
      17. Pour chaque ligne du fichier +/etc/hosts, affichez : + +
          + +
        • Le cinquième caractère;
        • + +
        • Les caractères 5 à 10, et le treizième;
        • + +
        • Tous les caractères à partir du quinzième.
        • + +
        + +

        Une manière de résoudre cet exercice consiste à utiliser le programme +sed qui sert à manipuler du texte.

        + +

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

        s/regexp/remplacement/

        regexp est une expression régulière et +remplacement un chaîne devant la remplacer.

        + +
          +
        • +Pour afficher le cinquième caractère de chaque ligne, on peut faire +ceci : +
          +clipper ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\).*/\1/"
          +
          +

          Le "^.\{4\}" du début sert à filtrer les +4 premiers caractères de chaque ligne. Ensuite, \(.\) filtre +n'importe quel caractère, le fait de mettre des parenthèses enregistre le +caractère en question dans une variable que l'on peut utiliser dans +la chaîne de remplacement avec "\1". Ensuite, +.* filtre le reste de la ligne.

        • +
        • +Sur le même principe, pour afficher les caractères 5 à 10 et le treizième : +
          +clipper ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\{6\}\)..\(.\).*/\1 \2/"
          +
          +
        • +
        • +Et enfin, pour afficher tous les caractères à partir du quinzième : +
          +clipper ~ $ cat /etc/hosts | sed -e "s/^.\{14\}//"
          +
          +
        • +
        +
      18. + + + + +
      + +

      Exercices sur les pages jaunes

      + + +

      +Les pages jaunes (yellow pages) sont un système qui centralise +certaines bases de données communes à toutes les machines du système (logins +et noms utilisateurs, mots de passes, groupes d'utilisateurs, noms et adresses +des autres machines sur le réseau) sur un petit nombre de serveurs redondants; +cela permet de garder des bases de données cohérentes, plus facilement que si +on devait mettre à jour leur contenu sur plusieurs centaines de machines à la +fois. +

      + +

      +On dit plutôt aujourd'hui NIS ou Network Information System, Yellow Pages +étant une marque déposée de British Telecom.

      + +

      +La commande ypcat permet de visualiser une base de données: citons en +particulier: ypcat passwd, ypcat group, ypcat +hosts.

      + +

      +Ces bases de données sont les versions centralisées des fichiers +/etc/passwd, /etc/group et /etc/hosts, lesquels ne +contiennent alors plus que quelques informations; par exemple, le fichier +/etc/hosts contient tout de même des adresses de machines, ne +serait-ce que celle du serveur de pages jaunes.... +

      + +
        + +
      1. Combien de personnes de la promotion 1996 ont un +login commençant par «l» ?

        + +Pour avoir une liste de tous les comptes, on tape

        + +
        ypcat passwd
        + +

        +On veut ensuite sélectionner les gens dont le répertoire personnel contient +/96/, et dont le login commence par l, et compter le nombre +de lignes (option -c de grep). On tape donc :

        + +
        ypcat passwd |grep c '^l.*/96/'
        +

        +et on obtient 19. +

        +
      2. + +
      3. Est-ce que des gens des promotions de la décennie +1980 ont encore un compte sur clipper ?

        + +On veut savoir si des chemins d'accès de répertoires personnels sont de la +forme

        + +
        /users/8[0-9]
        + +

        +On tape donc : +

        + +
        ypcat passwd | grep '/users/8[0-9]'
      4. + + +
      5. Combien y a-t-il de comptes d'élèves, magistériens, +etc (appartenant à une promotion) sur clipper ?

        + +On veut avoir une liste des gens dont le chemin d'accès du répertoire +personnel commence par /users/ et un numéro : /users/9[0-9] +(puisqu'on vient de voir qu'il n'y a pas de gens des promotions antérieures). +On utilise l'option -c (count) pour avoir le nombre de +personnes :

        + +
        ypcat passwd | grep -c '/users/9[0-9]/'
        +
      6. + + + +
      7. Classer les comptes de ces utilisateurs par numéro +d'UID

        + + +Le numéro d'ID (user identification) identifie les utilisateurs, les +numéros les plus bas correspondant au système (l'UID de root est 0). C'est le +troisième champ, les champs étant séparés par des deux-points. +

        + +

        +On va utiliser sort pour trier, selon un critère numérique (option +-n). Par défaut, avec sort les champs sont délimités par des +blancs, il faut donc indiquer qu'ici ce sont des deux-points, avec l'option +-t. Enfin, on trie en fonction du troisième champ (2, +la numérotation commençant à 0).

        + +

        +On suppose aussi que l'on veut pouvoir lire le résultat du tri avec +less. On tape donc :

        + +
        ypcat passwd | grep '/users/9[0-9]' | sort -n -t: +2 | less
        +
      8. + +
      9. Affichez le login des personnes ayant +zsh comme shell de login. + + +On utilise grep pour ne garder que les lignes des pages +jaunes correspondant aux personnes ayant zsh comme shell de +login et on utilise sed pour n'afficher que le login : +
        +bireme ~ $ ypcat passwd | grep "zsh$" | sed -e "s/:.*//"
        +
        +
        +Comme vous pourrez le constater, sur clipper, tout le +monde à /bin/sh comme shell de login. Le shell (en général +zsh) n'est lancé qu'à partir du script +.profile. Il s'agit d'un choix de l'administrateur système. +
        + +
      10. + + +
      11. Affichez le nom et le prénom des personnes +ayant un compte sur clipper, et dont le nom de famille contient au +moins 2 voyelles côte à côte. Compter ces personnes. + + +
        +bireme ~ $ ypcat passwd | sed -e "s/:\/.*//
        +s/.*://" | grep " .*[aeiou][aeiou].*"
        +
        +
      12. + +
      + + + +

      Divers

      + +
        + +
      1. Comment conserver les informations concernant +le disque dans un fichier ? + +

        +C'est la commande df qui donne des informations sur le disque et sur +les partitions montées. Pour rediriger la sortie d'une commande dans un +fichier, on utilise l'opérateur de redirection > suivi du nom du +fichier. Dans notre cas, pour conserver les informations dans un fichier +appelé disque, on écrira : +

        + +
        +df > disque
        +
      2. + +
      3. + + Comment connaître la dernière date de connexion au +système d'un utilisateur de login martin ? + +

        +C'est la commande finger qui donne des renseignements sur les +utilisateurs. Si on tape +

        + +
        +finger martin
        +
        + +

        +ou mieux (plus rapide), +

        + +
        +finger -m martin
        +
        + +

        +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 +dernière fois où il a lu son courrier (mais ce à condition qu'il ait reçu du +courrier depuis...). +

      4. + + + + + + +
      5. Affichez le type des fichiers /etc/passwd, +/usr/include/stdio.h, /bin/ls et de votre répertoire de +travail. + +

        +C'est la commande file qui permet d'afficher le type des fichiers. +Dans notre cas, il suffit d'écrire: +

        + +
        +galion ~ $ 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
        +galion ~ $
        +
        +
      6. + +
      + + +
      + Auteur : Anonyme, Joël Riou. Dernière modification le 2002-12-09. +
      + + + + + diff --git a/unix/exercices/solutions/find-sol.tml b/unix/exercices/solutions/find-sol.tml new file mode 100644 index 0000000..32932b0 --- /dev/null +++ b/unix/exercices/solutions/find-sol.tml @@ -0,0 +1,238 @@ + + + + + find + + + +

      Corrigés des exercices sur find

      + + +

      Ces exercices sont des questions de cours : les solutions se trouvent +toutes dans les pages de man des commandes en question. On suppose donc +connues les commandes de less, qui servent à se déplacer dans les +pages de man... et la commande servant à chercher un mot. Testez les +commandes sur des fichiers et répertoires d'essai pour vous faire la main et +comprendre ce qui se passe. +

      + + +

      Les options de find

      + + +
        + +
      1. Comment chercher tous les fichiers dont les noms +commençent par un «a» majuscule ou une minuscule, suivi d'éventuellement +quelques lettres ou chiffres, et se terminent par un chiffre entre 3 et +6 ?

        + + +C'est l'option -name qui permet de spécifier le nom du ou des +fichiers recherchés. On peut indiquer le nom d'un fichier complet +(bofichier.tex), ou utiliser des expressions régulières (celles du +shell, pas celles de grep...) :

        + +
          +
        • L'étoile (*) désigne «un ou plusieurs caractères»;
        • +
        • Le point d'interrogation remplace un (et un seul) caractère +quelconque;
        • +
        • Les crochets permettent de désigner une série de caractères au +choix.
        • +
        + +

        +Dans notre cas, le premier caractère 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
        +
        +
      2. + +
      3. 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? +

        +C'est l'option -mtime qui permet de donner une indication en +jours. La syntaxe varie selon ce que l'on souhaite : +

        + +
          +
        • -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;
        • +
        • -mtime -30 : le fichier a été modifié il y a 30 +jours ou moins.
        • +
      4. + +
      5. Comment faire pour dire que le fichier a été +modifié plus récemment qu'un autre fichier donné ?

        + +On utilise l'option -newer («plus récent»). Par exemple, on +cherche un fichier .tex modifié plus récemment 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 modifiés plus récemment que +bofichier.tex, mais il y a plus de 5 jours :

        + +
        +find . -newer bofichier.tex -mtime +5 -name '*.tex'
        +
      6. + +
      7. Comment fait-on pour spécifier que le fichier +recherché est un répertoire ?

        +On utilise l'option -type pour spécifier le genre de fichier +recherché : les principaux sont f (file) pour un +fichier normal, et d (directory) pour un répertoire. +On tape donc : +

        + +
        +find . -type d
        +
        +
      8. + +
      9. Comment indiquer que le fichier recherché à une +taille supérieure à une taille donnée ?

        + +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, supérieure, inférieure ou égale à la valeur +donnée.

        + +

        +Par exemple, on recherche un fichier modifié il y a moins de 12 jours et dont +la taille soit supérieure à 30 K :

        + +
        +find . -type f -size +30k -mtime -12 -print
        +
      10. + +
      + +

      Exécuter des commandes sur les fichiers trouvés

      + +

      Utiliser find pour effacer tous vos +fichiers de sauvegarde (terminés par un tilde) qui ont plus d'un mois. +

      + + +La ligne utilisée pour trouver ces fichiers et la suivante : +

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

      +Il y a deux façons de faire exécuter des commandes sur les fichiers trouvés +par find : utiliser l'option «-exec +commande», ou utiliser un pipe avec xargs. +

      + +
        + +
      1. -exec commande exécute la commande +sur le fichier courant. La commande est terminée par le marqueur +;, qu'il faut protéger du shell avec un backslash. Le fichier +courant est désigné par la chaîne {}. + +

        +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 exécuter la commande de façon interactive en remplaçant +-exec par -ok :

        + +
        +find . -mtime +30 -name '*~' -print  -ok  rm  \;
        +
        + +

        +Le programme demande, pour chaque fichier trouvé, si on veut bien exécuter la +commande; la réponse doit être «y» ou «Y». +

      2. + +
      3. La solution avec -exec est en fait très lourde, car elle +crée un nouveau processus pour chaque fichier; il vaut mieux +rediriger le résultat de find avec un pipe et +xargs. Dans notre cas, on tapera donc : + + +
        +find . mtime +30 -name '*~' | xargs -p rm
        +
        + +

        +L'option -p de xargs rend cette commande +interactive. Il faut répondre «y» ou «Y» pour +confirmer. +

      4. + +
      + +

      +Quelle différence 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». 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. + +
      3. Vous tapez +
        +find /usr/local/lib/texmf/tex -type f | xargs grep supertab
        +
        + +

        +grep cherche dans chaque fichier passé en argument la chaîne de +caractères «supertab», ce qui est très différent...

      4. + + +
      + + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-09. +
      + + + + diff --git a/unix/exercices/solutions/grep-sol.tml b/unix/exercices/solutions/grep-sol.tml new file mode 100644 index 0000000..688261d --- /dev/null +++ b/unix/exercices/solutions/grep-sol.tml @@ -0,0 +1,590 @@ + + + + + grep + + + + +

      Exercices sur grep : corrigés

      + +

      +Ces exercices sont des questions de cours : les solutions se trouvent +toutes dans les pages de man des commandes en question. On suppose donc +connues les commandes de less, qui servent à se déplacer dans les +pages de man... et la commande servant à chercher un mot. Testez les +commandes sur des fichiers et répertoires d'essai pour vous faire la main et +comprendre ce qui se passe. +

      + + + +

      Les options de grep

      + + +
        + +
      1. Quelles sont les options de grep +qui permettent d'obtenir des lignes de contexte (qui précèdent et/ou suivent +la ligne où figure le mot) ?

        + +Il y en a plusieurs, qui se recoupent :

        + +
          +
        • -num : le numéro indique le nombre de +lignes de contexte que l'on veut voir figurer avant et après la ligne où +figure le mot recherché. Par exemple, si on veut trois lignes de contexte, +avant et après la mot (soit sept lignes au total), on tape : + +
          +grep -3 ...
          +
          +
        • + +
        • -A num (after) : le numéro +indique le nombre de lignes qui doivent suivre la ligne où figure le mot. Si +on en veut quatre, on tapera : + + +
          +grep -A 4 ...
          +
          +
        • + + +
        • -B num (before)  : le +numéro indique le nombre de lignes qui doivent précéder 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 après. En fait, les trois lignes suivantes sont strictement +équivalentes : +
          +grep -2 ... 
          +grep -C ... 
          +grep -A 2 -B 2 ...
          +
          +
        • + +
      2. + +
      3. Comment faire apparaître le numéro de la +ligne où figure le mot recherché ? +

        +C'est l'option -n (number) qui sert à cela; le numéro +figure tout au début de la ligne, suivi d'un deux-points (:) et +du texte. Par exemple :

        + +
        +bireme ~ $ grep -n violon verlaine.tex
        +12:des violons de l'automne
        +
        +

        +Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure +d'abord, puis le numéro de la ligne, et enfin le texte, le tout séparé par des +deux-points. Par exemple : +

        + +
        +bireme ~ $ 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 ?

        + +La disposition générale ne change pas, par contre, le signe utilisé pour +séparer la ligne de son numéro 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 :

        + +
        +bireme ~ $" grep -nC violon verlaine.tex
        +10- 
        +11-Les sanglots longs 
        +12:des violons de l'automne 
        +13-bercent mon coeur 
        +14-d'une langueur monotone 
        +
        +
      4. + +
      5. Comment faire pour afficher le nombre +d'occurences du mot recherché ?

        + +On utilise l'option -c (count) : +

        + +
        +bireme ~ $ grep -c violon *
        +verlaine.tex:1
        +orchestre:1
        +
        +
      6. + +
      7. Comment faire pour que grep +ignore la casse des caractères (différence entre majuscules et minuscules) +dans sa recherche ? +

        +Par défaut, grep fait la différence entre les majuscules et les +minuscules; pour invalider ce comportement, on utilise l'option +-i (ignorecase).

        +
      8. + +
      9. Comment faire pour faire apparaître non pas les +lignes où figurent le mot, mais les noms des fichiers ? +

        +C'est l'option -l qui permet de faire cela : afficher les +noms des fichiers où figure au moins une fois la chaîne de caractères +recherchée.

      10. + +
      11. Comment faire apparaître les lignes où ne +figurent pas le mot recherché ? +

        +On veut en fait inverser le sens de la recherche : c'est l'option +-v qui fait cela. +

      12. + +
      13. Comment faire apparaître les noms des fichiers +ne contenant pas le mot recherché ? +

        +On utilise l'option -L, qui affiche les noms de fichiers où ne +figurent pas la chaîne de caractères recherchée. Il ne faut bien sûr pas +confondre les options -l et -L... +

      14. + +
      15. Comment faire pour que grep ne +recherche que les lignes où figure le mot tel quel, et non pas ses +variantes ?

        + +C'est l'option -w (comme word) qui sert à cela : un +mot complet est délimité comme suit : +

        + +
          + +
        • Début : la chaîne de caractères est placée au début d'une ligne, ou +précédée d'un blanc, d'une tabulation ou d'une ponctuation.
        • + +
        • Fin : la chaîne de caractère est placée 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 dérivée de ce mot, on +écrit : +

        + +
        +grep -w travail mon-fichier
        +
        +
      16. + +
      17. Comment faire pour chercher plusieurs mots à la +fois en faisant apparaître les numéros des lignes ?

        +On veut chercher toutes les occurences des mots «terre» et «ciel» dans les +deux premiers chapitres de la première partie de Germinal, avec les +numéros des lignes. On propose deux solutions, la première utilisant les +ressources de la syntaxe de grep, la seconde utilisant l'option +-f avec un fichier.

        + +
          + +
        1. 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 protéger +contre le shell, c'est-à-dire pour que le shell ne cherche pas à interpréter +l'expression. +

        2. + +
        3. 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 chaîne de caractères «terre ciel», qui est +assez improbable en français. Il ne faut pas non plus laisser de ligne +blanche : le programme afficherait l'ensemble du texte. +

          +
        4. +
        + +

        +Quelle que soit la solution retenue, on veut ensuite afficher le numéro des +lignes (option -n); d'autre part, pour que la recherche soit +exhaustive, il vaut mieux que grep ne fasse pas de différence +entre les majuscules et les minuscules, avec l'option -i +(ignore case, ignorer la casse des caractères). Il faut aussi décider +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 +dérivés, on utilise l'option -w. +

        + +

        +Pour désigner les deux fichiers où faire la recherche, on peut les écrire +littéralement : +

        + +
        +zola1.txt zola2.txt
        +
        +

        +ou, mieux, utiliser les joker du shell : +

        +
        +zola[12].txt
        +
        + +

        [12] signifie «le caractère 1 ou le caractère 2».

        + +

        +Finalement, on peut taper, au choix :

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

        +Et on obtient : +

        + +
        +zola1.txt:13:ciel, le pavé se déroulait avec la rectitude d'une jetée, au 
        +milieu de
        +zola1.txt:36:brûlaient 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 accès de toux annonça le retour du charretier.  
        +Le ntement,
        +zola1.txt:191:bleues en plein ciel, comme des torches géantes. C'était d'une 
        +tristesse
        +zola1.txt:207:     Le manoeuvre, après 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 résultat est un peu différent quand on n'utilise pas l'option +-w.

        +
      18. + +
      + +

      Introduction aux expressions régulières

      + +

      +grep recherche des chaînes de caractères, qui peuvent être un mot +complet («terre»), une suite de lettres («tre»), ou une expression régulière. +Les expressions régulières sont des formules qui représentent des chaînes de +caractères. On cherche alors non pas un mot précis, mais des suites de +caractères correspondant aux critères demandés. Elles sont d'un usage fréquent +avec grep bien sûr, mais aussi avec des commandes comme +less, ou encore au sein d'un éditeur. +

      + +

      +«Expressions régulières» (Regular expressions en anglais) se +traduisent en bon français par «expressions rationnelles», mais l'usage est de +dire «régulières». +

      + +

      +Ces exercices n'entendent pas remplacer un cours sur les expressions +régulières, ni faire le tour de leurs possibilités. +

      + +
        +
      1. Chercher toutes les lignes commençant par «a» ou +«A» .

        +Il faut indiquer que l'on veut le début de la ligne, avec le chapeau +(caret en anglais). Ensuite, on veut préciser que la ligne commence +par un «a» minuscule ou majuscule. Il y a deux façons de le faire : +

        + +
          + +
        • Utiliser l'option -i qui fait ignorer la différence 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 protéger les signes contre le shell, pour qu'il ne les +interprète pas; on met donc l'expression entre apostrophes. Remarque : +la protection des expressions régulières contre le shell est une question +complexe.... +

        + +

        +Il faut donc écrire : +

        + +
        +grep -i '^a' fichier
        +
        + +

        +ou +

        + +
        +grep '^[aA]' fichier
        +
        +
      2. + + +
      3. Chercher toutes les lignes finissant par +«rs»

        + + +C'est le dollar ($) qui représente la fin de la ligne. Il faut +donc écrire :

        + +
        +grep 'rs$' fichier
        +
      4. + +
      5. Chercher toutes les lignes contenant au moins un +chiffre

        + + +Pour désigner un chiffre, on peut en indiquer une liste entre crochets : +[0123456789]. Il est plus simple d'utiliser une classe de +caractères : [0-9] qui désigne, comme la solution précédente, +n'importe quel chiffre de zéro à neuf. +

        +

        +Il faut donc taper :

        +
        +grep '[0-9]' fichier
        +
        +
      6. + +
      7. Chercher toutes les lignes commençant par une +majuscule

        + + +Comme on l'a vu, c'est le chapeau qui indique le début de la ligne. Pour +indiquer que l'on cherche une majuscule, on peut soit en donner une liste +([ABCDEFGHIJKLMNOPQRSTUVWXYZ]), soit utiliser une classe de +caractères : [A-Z], la seconde solution étant, de loin, +préférable... +

        +

        +Il faut donc taper : +

        +
        +grep '^[A-Z]' fichier
        +
        +
      8. + +
      9. Chercher toutes les lignes commençant par «B», +«E» ou «Q»

        + + +Il faut indiquer entre crochets les trois lettres recherchées : +

        + +
        +grep '^[BEQ]' fichier
        +
        +
      10. + + +
      11. Chercher toutes les lignes finissant par un point +d'exclamation

        + + +Le point d'exclamation n'a pas de signification particulière avec +grep, on peut donc le mettre tel quel : +

        + +
        +grep '!$' fichier
        +
        +
      12. + +
      13. Chercher toutes les lignes ne finissant pas par +un signe de ponctuation (point, virgule, point-virgule, deux-points, point +d'interrogation, point d'exclamation)

        + + +Il faut donner une liste de caractères, que l'on ne veut pas voir figurer; la +liste sera entre crochets, comme on l'a déjà 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 caractères sont +spéciaux avec grep. Vous vous doutez que le chapeau est spécial +quand il est placé au début de l'expression, et que le dollar l'est quand il +est placé en fin d'expression. Dans notre cas : +

        +
          + +
        • Le point désigne n'importe quel caractère.
        • + +
        • Le point d'interrogation signifie «le caractère qui précède apparaît 0 ou +1 fois». Avec egrep, il fonctionne tout seul, avec +grep, il faut le faire précéder 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 interprète littéralement ces caractères, et ne les +considère plus comme spéciaux, il faut les faire précéder 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 caractères sont protégés 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 chaîne de caractères donnée; dans ce cas, on tape : +

        + +
        +grep  -v '[.,;:?!]$' fichier
        +
        +
      14. + + +
      15. Comment chercher tous les mots contenant un «r» +précédé de n'importe quelle lettre majuscule ou minuscule ? +

        + +On cherche une chaîne de caractères qui soit indifféremment au début ou au +milieu d'un mot. N'importe quelle lettre, ce sont les classes de caractères +[a-zA-Z] ou [:alpha:], qui sont équivalentes. +

        + +

        +Il y a une petite subtilité avec l'emploi de classes du second type; elles +désignent un groupe de caractères, et il faut mettre une seconde paire de +crochets pour dire «n'importe quel caractère de cette classe prédéfinie». +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 caractères accentués... +

      16. + +
      17. Chercher tous les mots dont la seconde lettre est +un «r» . + +

        +C'est le symbole \< qui désigne un début de mot. La première +lettre du mot est indifférente, la seconde est un «r». On écrit donc : +

        +
        +grep '\<.r' fichier
        +
        + + +

        +Il y a cependant un problème avec les caractères accentués, que +grep considère comme des blancs. Dans ce cas, il vaut mieux +procéder autrement : un mot est précédé d'un début de ligne, ou d'un +blanc ou d'une tabulation. Un début de ligne, c'est le chapeau, un blanc ou +une tabulation, c'est la classe de caractères [:space:]. +

        +

        +On va se servir du pipe (|) qui signifie «ou». Avec +grep, il faut backslasher le pipe, avec egrep ce +n'est pas nécessaire. On écrit donc (avec grep) : +

        + +
        +grep '^.r|[[:space:]].r' fichier
        +
        + +

        +Ce n'est quand même pas si simple; les mots peuvent être précédés d'un tiret +(mots composés), d'une apostrophe, de guillemets divers (``, +", «, <<), et, si l'auteur du +texte n'est pas respectueux des règles de typographie, d'une ponctuation. Il y +a donc bien des cas à envisager... +

        +
      18. +
      + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + diff --git a/unix/exercices/solutions/less-sol.tml b/unix/exercices/solutions/less-sol.tml new file mode 100644 index 0000000..9073faf --- /dev/null +++ b/unix/exercices/solutions/less-sol.tml @@ -0,0 +1,240 @@ + + + + + less + + + +

      Corrigé des exercices sur less

      + +

      +On aborde ici less, qui est une version plus élaborée de +more; ce dernier est toujours détaillé dans dans les ouvrages sur +Unix, et de fait il est toujours présent sur ces systèmes, ce qui n'est pas +forcément vrai pour less (qui est quand même très courant). +more est beaucoup plus rudimentaire, alors que less +a beaucoup de fonctionnalités appréciables : vidéo inverse pour les +motifs recherchés, déplacements en avant et en arrière pour la recherche, etc. +

      + + +
        + +
      1. Comment fait-on pour obtenir une page d'aide avec +less ? + +

        On tape h ou H pour afficher une page d'aide. On s'y +déplace comme dans less (flèches, ^D, +^F, ^B, ^P, SPC, +j, k...). Pour quitter l'aide, ce sont les mêmes +commandes que pour quitter less : q, +Q, :q, :Q, ZZ. +

      2. + +
      3. Comment examiner plusieurs fichiers à la +suite ? Comment passe-t-on au suivant ? Comment revient-on au +précédent ? + +

        +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 précédent, on tape :p (previous). +:x permet de revenir au premier fichier spécifié. +

      4. + +
      5. Quelles sont les commandes différentes qui +permettent de quitter less ? +

        +Ce sont : q, Q, :q, :Q, +ZZ. +

      6. + +
      7. Comment dire à less d'ouvrir le +fichier en plaçant en haut de l'écran la ligne n ? + + +

        +On spécifie le numéro de la ligne après le signe +; par exemple, +pour ouvrir le fichier rapport sur la ligne 57, on tape : +

        + + +
        +less +57 rapport
        +
        +
      8. + +
      9. Comment dire à less d'ouvrir le +fichier en plaçant en haut de l'écran la première ligne où apparaît un motif +donné ? + +

        +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 façon suivante : +

        +
        +less +/toto rapport
        +
        +
      10. + +
      11. Quelles sont les deux commandes de +less qui permettent de chercher un motif dans un fichier, +respectivement après et avant la position courante ? + +

        +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 arrière 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 précédente 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 début ou la fin du fichier atteint, la recherche s'arrête. On +peut utiliser les expressions régulières. +

      12. + + + + +
      13. Comment dire à less de chercher le +mot à partir de la première ligne du fichier, et ce où que l'on soit dans le +fichier ?

        +Il faut taper ^F après 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 début 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é. +

      14. + + +
      15. 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 +caractères ? +

        +L'option -i signifie ignorecase, c'est-à-dire ignorer la +casse des caractères (différence entre majuscules et minuscules). Si donc +je tape (au choix) : +

        + +
        +less -ip TOTO rapport
        +less -ip toto rapport
        +less -i +/toto rapport
        +less -i +/TOTO rapport
        +
        + +

        +less ne fera pas la différence entre les majuscules et les +minuscules, et je trouverai toto comme TOTO. Bien +sûr, c'est la même chose si je lance less avec l'option +-i et que je cherche ensuite le mot à l'intérieur du fichier avec +/ ou ?. +

        + +

        +Mais l'option -i est invalidée si le motif +recherché contient des majuscules et des minuscules : si, en +lançant 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». +

      16. + +
      17. Quelles sont les commandes qui permettent d'aller +à la prochaine (resp. précédente) occurence du motif recherché à travers +tous les fichiers édités ? + +

        +Pour aller à l'occurence suivante (resp. précédente) d'un motif dans un +fichier, on utilise n (resp. N). Pour faire la même +opération mais sans passer manuellement de fichier en fichier, on tape +ESC n pour chercher en avant, et ESC N pour chercher +en arrière. ESC désigne bien sûr la touche d'échappement +(Escape). +

      18. + +
      19. Comment chercher dans un fichier le caractère +/ ?

        +Le caractère / sert à chercher un mot dans le fichier. Si on tape +

        +
        +//
        +
        + +

        +less répond : Pattern not found. Il faut donc +dire à less de considérer le / comme un caractère +ordinaire, et pas comme un caractère spécial. Comme avec toutes les +expressions régulières, c'est le backslash (barre oblique vers la +gauche : \) qui sert à cela. Pour chercher un +/, on tape donc : +

        +
        +/\/
        +
        + +

        La page de man donne une liste de caractères qui sont spéciaux avec +/ et ?. Ces commandes de recherche utilisent les +expressions régulières de ed (et de vi par +conséquent). +

      20. + + +
      + + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + diff --git a/unix/exercices/solutions/ls-sol.tml b/unix/exercices/solutions/ls-sol.tml new file mode 100644 index 0000000..e91d34e --- /dev/null +++ b/unix/exercices/solutions/ls-sol.tml @@ -0,0 +1,315 @@ + + + + + ls + + + +

      Corrigé des exercices sur ls

      + +

      Ces exercices sont des questions de cours : les solutions se trouvent +toutes dans les pages de man des commandes en question. On suppose donc +connues les commandes de less, qui servent à se déplacer dans les +pages de man... et la commande servant à chercher un mot. Testez les +commandes sur des fichiers et répertoires d'essai pour vous faire la main et +comprendre ce qui se passe.

      + +
        + +
      1. Affichez le contenu de +/usr/local/games/bin + +
        +ls /usr/local/games/bin
        +
        + +

        Vous obtenez une liste des jeux installés.

      2. + +
      3. Quelle est la taille de votre +.flnewsrc.forum  ? + + +
        ls -al .flnewsrc.forum
        + + +

        +L'option -a fait apparaître 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 abonnés et les messages que +vous avez déjà lus. Il est remis à jour à chaque fois que vous lisez +forum : la date indiquée correspond donc à la dernière fois que vous avec +lancé (ou plus précisément, quitté...) forum. +

      4. + + +
      5. À quoi sert l'option -R de +ls ? + +

        Cette option permet d'afficher une liste récursive, c'est-à-dire qui indique +le contenu des répertoires listés, ainsi que de leurs sous-répertoires. Si +vous tapez ls -R dans votre répertoire personnel, vous aurez une +liste de tout ce que vous avez chez vous.

      6. + +
      7. Dans quel ordre les fichiers et répertoires +sont-ils classés par défaut? Quelles sont les options qui peuvent servir à +modifier ce critère de classement ? + +

        +Pour savoir cela, il faut chercher le mot sort dans le man de +ls. La première occurence vous dit que par défaut le résultat est +trié par ordre alphabétique, selon la première lettre des fichiers. De façon +plus précise, l'ordre est le suivant : ponctuations, chiffres, +majuscules, minuscules, selon l'ordre défini par la table des caractères +ASCII.

        + +

        +En continuant à chercher, vous trouvez des options intéressantes : +-r (reverse), qui inverse l'ordre de classement, +-t (time) qui trie en fonction de la date de dernière +modification.

        +
      8. + +
      9. Affichez le contenu de votre répertoire courant de +telle sorte que les fichiers modifiés récemment apparaissent en +premier. + +
        +ls -t
        +
        +

        +si vous voulez juste modifier le critère de tri, sans plus de renseignements; +ou encore

        +
        ls -lt
        +

        +si vous voulez une longue liste. +

      10. + +
      11. Quels sont les droits de votre répertoire +Mail ? Qu'est-ce que cela signifie ? + + +

        +La ligne ressemble à ceci : +

        + +
        +drwx------ 2 toto  litt98 512 Apr  2 19:02 Mail
        +
        + +

        +Le d indique qu'il s'agit d'un répertoire (directory). +Suivent ensuite neuf caractères, allant par trois; r, w, x +correspondent aux droits que vous avez sur le répertoire (ou le +fichier) : r (read) pour le droit de lecture, +w (write) pour le droit d'écriture, x +(execute) pour le droit d'exécution. +

        + +

        +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 répertoire. +

        + +

        +Cela veut dire que seul le propriétaire a le droit de lire et écrire dans son +répertoire Mail/, ainsi que d'y accéder. Les répertoires et les +fichiers de courrier sont protégés contre les indiscrétions. +

        + +

        +Un fichier de texte standard a les droits suivants : +

        + +
        +-rw-r--r--
        +
        + + +

        Il y a un tiret tout au début, 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 exécutable.

        + + +

        +Remarque : ne cédez pas à la paranoïa... 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. +

      12. + +
      13. Décrivez le résultat de la commande +ls -l. + +
          + +
        • + +
          +-rw-r--r-- 1 robin    litt95     754 Mar 22 11:59 projet.aux
          +
          + +

          Les dix premiers caractères détaillent les droits du fichier. Le premier +caratère identifie le type du fichier : ici, rien n'est spécifié, c'est +donc un fichier normal. L'exercice précédent détaille la signification des +lettres suivantes. Ce sont les droits normaux d'un fichier standard : +tout le monde (propriétaire, groupe et autres utilisateurs) peut lire le +fichier, seul le propriétaire peut écrire dedans. +

          +
        • + + +
        • +
          +-rw-r--r-- 1 robin    litt95     754 Mar 22 11:59 projet.aux
          +
          + +

          +Le chiffre indique le nombre de liens. Nous vous renvoyons aux exercices sur +les liens pour plus d'explications (qui peuvent attendre à un niveau +débutant...). +

        • + +
        • +
          +-rw-r--r-- 1 robin    litt95     754 Mar 22 11:59 projet.aux
          +
          +

          +Le troisième champ donne le nom du propriétaire 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 littéraire 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 considéré. 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 dernière modification du fichier, ici le 22 mars +de l'année courante, à 11h59. Quand le fichier date d'une année antérieure, +celle-ci est indiquée et l'heure ne figure plus.

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

        • + +
      14. + +
      15. Comment afficher les droits d'un répertoire +donné ? + +

        +Si on tape +

        + +
        +ls -l repertoire/
        +
        + +

        +c'est le contenu du répertoire qui s'affiche, et pas son statut à lui. +L'option -d (directory) permet de lister le répertoire +lui-même. +

      16. + +
      17. Caractères identifiant les fichiers +

        +Ce sont les caractères suivants : +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        slash(/)pour un répertoire
        arobase(@)pour un lien symbolique
        étoile(*)pour un exécutable
        pipe(|)pour un pipe nommé
        égal(=)pour un socket
        + +

        +C'est l'option -F qui permet de les afficher. +

      18. + + +
      19. Droits sur un répertoire + +

        +Avoir le droit d'«exécuter» un répertoire, c'est avoir le droit d'y accéder, +de s'y déplacer; mais je n'ai pas le droit de «lire» son contenu. Donc, à +moins d'en être propriétaire, je ne peux pas afficher le contenu d'un +répertoire ayant comme droits : +

        + +
        +drwx--x--x
        +
        +
      20. + +
      + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + diff --git a/unix/exercices/solutions/mkdir_cd-sol.tml b/unix/exercices/solutions/mkdir_cd-sol.tml new file mode 100644 index 0000000..05288af --- /dev/null +++ b/unix/exercices/solutions/mkdir_cd-sol.tml @@ -0,0 +1,288 @@ + + + + + Répertoires + + + +

      Corrigé des exercices sur les répertoires +(mkdir, rmdir, cd)

      + +

      +Ces exercices sont des questions de cours : les solutions se trouvent +toutes dans les pages de man des commandes en question. On suppose donc +connues les commandes de less, qui servent à se déplacer dans +les pages de man... et la commande servant à chercher un mot. Testez les +commandes sur des fichiers et répertoires d'essai pour vous faire la main et +comprendre ce qui se passe.

      + +

      mkdir, rmdir

      + +
        + +
      1. Créez trois répertoires en une seule ligne de +commande. + +

        +Si vous voulez créer trois répertoires bla, ble et +bli, tapez +

        + +
        +mkdir bla ble bli
        +
      2. + +
      3. Effacez ces trois répertoires en une seule ligne +de commande . + +

        +Il faut taper +

        + +
        +rmdir bla ble bli
        +
      4. + + + +
      5. Que se passe-t-il si vous tapez mkdir +mkdir  ? + +

        Vous créez chez vous un répertoire appelé mkdir.

        +
      6. + +
      7. Vous voulez détruire un répertoire +bla/... mais ça ne marche pas. + +

        +ls vous dit qu'il est vide, et pourtant vous ne réussissez pas à +l'effacer : c'est qu'il n'est pas vide. Il doit y avoir des fichiers +cachés, commençant par un point, que vous ne voyez pas avec ls +sans option. Il faut taper +

        + +
        +ls -a
        +
        +

        +et effacer les fichiers trouvés. +

      8. + +
      9. Est-ce que mkdir peut prendre des +options ? +

        +Oui, une : l'option -p, dont on va parler tout de suite. +

      10. + +
      11. À quelle condition est-ce que la ligne de commande +«mkdir Rapport/annexes» peut fonctionner et créer effectivement +ce sous-répertoire ? + +

        +Il faut que le répertoire Rapport existe, pour que l'on puisse y +créer un sous-répertoire. +

      12. + +
      13. Y a-t-il une option de mkdir qui +permette de créer à la fois un répertoire et un sous-répertoire de ce +répertoire ? + +

        +Oui, c'est l'option -p. Quand vous tapez +

        + +
        mkdir -p Rapport/annexes
        +
        + +

        +un répertoire Rapport est créé, et dans ce répertoire un +sous-répertoire annexes. +

      14. + +
      15. Comment créer un répertoire en spécifiant des +droits ? + +

        +On utilise l'option -m (mode) de mkdir. +Par exemple : +

        + +
        +bireme ~ $ mkdir -m 700 Mail
        +bireme ~ $ ls -ld Mail
        +drwx------   2 robin    litt95     2048 Jun  2 15:27 Mail/
        +
      16. + + +
      17. Quel est l'effet de la commande +suivante : +
         rmdir -p toto/tata/tutu/
        + +

        +Cette commande efface toute la hiérarchie des répertoires, à 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'arrête. +

      18. + + + +
      19. Création récursive sans message d'erreur + +

        +On achève avec ceci le tour de l'option -p... Si donc on tape +

        + +
        +mkdir -p toto/tutu/
        +
        +

        +le sous-répertoire tutu/ est créé si toto/ existe +déjà; et si toto/ n'existe pas, ce répertoire et son +sous-répertoire sont créés. Il n'y a pas de message d'erreur. +

      20. + +
      + +

      cd

      + +

      +But de l'exercice : apprendre à se servir de . et +.. («point» et «point point»). .. désigne le +répertoire père du répertoire courant, et . désigne le répertoire +courant. .. sert beaucoup avec cd, pour remonter +d'un niveau dans une arborescence; . est très utile avec des +commandes comme mv ou cp, où il signifie en fait +«ici». +

      + +

      + +[Exemple d'arborescence] + +

      + +
        + +
      1. Dans quel répertoire vous trouvez-vous quand vous +vous loguez ? + +

        +Vous vous trouvez dans votre répertoire personnel, dans ~ (tilde). +

      2. + +
      3. Allez directement dans +~/Rapport/docs/afaire/ + +

        +Taper +

        + +
        +cd Rapport/docs/afaire
        +
      4. + +
      5. De là, passez dans +~/Rapport/docs/fait/ + + +
        +cd ../fait
        +
      6. + + +
      7. Revenez dans ~/Rapport/ + +

        +Taper +

        +
        +cd ../..
        +
        +

        +ou +

        +
        +cd ~/Rapport
        +
      8. + + + +
      9. Sans changer de répertoire, regardez avec +less le contenu de ~/www/index.html + + +

        +Il faut taper +

        + +
        +less ~/www/index.html
        +
        +

        +ou +

        +
        +less ../www/index.html
        +
        +
      10. + + +
      11. Passez dans ~/Rapport/docs/ + + +
        +cd docs/
        +
        +
      12. + +
      13. En restant là où vous êtes, affichez les droits de +~/Mail/ + + +

        +Il y a un petit piège dans cette question. En effet, si vous tapez

        +
        +ls -l Mail/
        +
        + +

        +vous allez obtenir le contenu du répertoire Mail/, mais pas le +statut du répertoire lui-même. Il faut donc utiliser l'option -d +de ls : +

        + +
        +bireme ~ $ ls -ld Mail
        +drwx------ 2 toto  litt98 512 Apr  2 19:02 /users/98/litt/toto/Mail/
        +
        +
      14. + +
      15. Revenez dans votre répertoire principal + + +

        +Taper cd, sans arguments. +

        +
      16. + +
      17. Que se passe-t-il si vous vous déloguez alors que +vous n'êtes pas dans votre répertoire principal ? + +

        +Strictement rien ! Ça n'a aucune importance. +

      18. + +
      + +
      + Auteur : Émilia Robin, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + + diff --git a/unix/exercices/systeme.tml b/unix/exercices/systeme.tml new file mode 100644 index 0000000..6b1cc32 --- /dev/null +++ b/unix/exercices/systeme.tml @@ -0,0 +1,398 @@ + + + + + Système + + + +

      Exercices sur le système

      + + +

      Les droits

      + + +
        + +
      1. &icone.solution; + +Changez les droits d'un fichier fic1 pour que tous ceux de votre +groupe puissent écrire dedans.
      2. + + + +
      3. &icone.solution; + +Donnez en une seule ligne le droit d'exécution à tous les utilisateurs d'un +fichier script qui n'a jusqu'alors que des droits standards +(-rw-r--r--).
      4. + + +
      5. &icone.solution; + +Le fichier toto a les droits suivants : -rwxr--r--. +Modifiez-en les droits en une ligne de commande de sorte que le +propriétaire n'ait plus que le droit de lecture.
      6. + + +
      7. &icone.solution; + +Modifier les droits du fichier toto (-rwxr--r--) de sorte +que le groupe et les autres utilisateurs aient les mêmes droits que le +propriétaire.
      8. + + + + + +
      9. &icone.solution; + +Quelle option permet de modifier récursivement les droits d'un répertoire +et des fichiers qu'il contient ?
      10. + + + +
      11. &icone.solution; + +Quelle option de mkdir permet de créer un répertoire en spécifiant +les droits sur ce répertoire ?
      12. + + + + +
      13. &icone.solution; + +Affichez et interprétez les droits de /bin/mount.
      14. + +
      + + +

      Les liens

      + + +
        + +
      1. &icone.solution; + +Vous avez chez vous un répertoire tmp/ qui contient un fichier +bidon. Créez un lien physique sur tmp/bidon appelé +blo, dans votre répertoire d'accueil (HOME). Comparez +les contenus de tmp/bidon et de blo. Que contient +blo ?
      2. + + +
      3. &icone.solution; + +Même question avec un lien symbolique.
      4. + + + +
      5. &icone.solution; + +Quelles sont les différences entre les liens durs et les liens +symboliques ?
      6. + + + +
      7. &icone.solution; + +Dans quel cas ne peut-on pas faire de lien physique ? Que faut-il +faire ?
      8. + + +
      9. &icone.solution; + +Quel est l'effet de chmod sur un lien ?
      10. + + +
      + + +

      Les processus

      + + +
        + +
      1. &icone.solution; + +Affichez la liste des processus associés à votre terminal. Affichez la +liste des processus dont vous êtes propriétaire. Recommencez en utilisant +les options -l et -f. À quoi correspondent les colonnes +PID et PPID ?
      2. + + +
      3. &icone.solution; + +Lancez une commande longue en arrière plan. Quel est le comportement du +processus associé lorsqu'il reçoit les signaux suivants : + +
          + +
        • sigkill (9)
        • + +
        • sigstop (23)
        • + +
        • sigcont (25)
        • + +
      4. + + +
      5. &icone.solution; + +Utilisez la commande nice pour lancer des commandes ayant une +faible priorité.
      6. + + +
      7. &icone.solution; + +Interprétez la hiérarchie des processus qui vous appartiennent. Quelle est +la hiérarchie des processus communiquant par un tube ? Utilisez par +exemple ls -R / | grep 'a' | cut -c1-3.
      8. + + +
      9. &icone.solution; + +La commande ps | wc compte deux processus en plus de ceux qui +existent réellement lorsqu'on lance la commande. Pourquoi ?
      10. + + +
      11. &icone.solution; + +Donner deux commandes pour reprendre l'exécution d'une instruction +interrompue par un ^Z.
      12. + + +
      13. &icone.solution; + +À quoi correspondent les colonnes PID et PPID qui +apparaissent après l'exécution de la commande ps ?
      14. + + +
      + + +

      Programmation du shell

      + + + + + +
        +
      1. &icone.solution; + +Faites deux scripts qui vous disent bonjour en affichant votre login +(«Bonjour, toto») : + +
          +
        • Quand vous tapez saluer [votre-login]
        • +
        • Quand vous tapez juste saluer
        • +
      2. + + +
      3. &icone.solution; + +Faites un script qui vous dit «Bonjour, [toto]», que vous indiquiez ou +non votre login.
      4. + + + +
      5. &icone.solution; + +Faire un script qui affiche la phrase : Le script [script] a [n] +paramètre(s), que voici : [paramètres], en remplaçant les mots entre +crochets par leur valeur; par exemple : + + +
        +chaland ~ $script bla ble bli blo blu  
        +La commande script a 5 paramètre(s), que voici : bla ble bli blo blu
        +
      6. + + + + +
      7. &icone.solution; + +Créez une commande qui, lorsqu'elle est appelée, renvoie le nombre +d'arguments qui lui ont été fournis, ainsi que le premier de ces +arguments.
      8. + + +
      9. &icone.solution; + +Vous voulez écrire un script qui vous dit combien de personnes sont loguées +sur une machine donnée; par exemple : + +
        +drakkar ~ $ combien galion
        +Il y a 5 personne(s) loguées sur galion en ce moment.
        +drakkar ~ $
        +
      10. + + +
      11. &icone.solution; + On veut remplacer +le suffixe .htm d'un ensemble de fichiers en +.html.
      12. + + + +
      13. &icone.solution; + Un ensemble de +noms de fichiers sont en majuscules. On veut tout basculer en minuscules.
      14. + + + +
      15. &icone.solution; + +Créez 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.

      16. + + +
      17. &icone.solution; + +On ne s'intéresse 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.
        +
        +
      18. + + +
      19. &icone.solution; + +On veut chercher toutes les occurences des quatre éléments (terre, air, eau, +feu) dans la première partie de Germinal. + +

        +On veut aussi que le résultat soit placé dans un fichier, et que le résultat +soit classé : toutes les lignes qui contiennent «air», puis toutes celles qui +contiennent «eau», etc.

      20. + + + +
      21. &icone.solution; + +Chercher le mot «mine» dans les chapitres 3, 4 et 5 de la première partie de +Germinal, et obtenir un fichier dans lequel figure le nombre +d'occurences du mot dans les fichiers, avec le numéro des lignes.
      22. + + + + +
      23. &icone.solution; + +Créez un script coupe qui prend trois arguments, le premier étant +un nom de fichier et les deux autres des entiers l et l', +et qui affiche les lignes comprises entre l et l' dans le +fichier. Par exemple, +
        +coupe fic 4 8
        +
        +

        +affichera les lignes 4 à 8 du fichier fic. Affichez des messages +en cas d'erreur (nombre de paramètres incorrect, fichier inexistant, etc). +

      24. + + + + +
      25. &icone.solution; + +Pour transformer une arborescence en un seul fichier compressé, on utilise +l'instruction
        tar zcvf nouveaunom fichiersaregrouper
        + + +

        +Avant d'envoyer des fichiers tar, on utilise uuencode. +

        + +

        +Écrivez une commande tarmail qui prend deux arguments, une +adresse et un nom de répertoire, et qui envoie par mail le contenu de +l'arborescence du répertoire précédée d'un message expliquant comment la +récupérer.

        + + +

        +Note : pour récupérer un fichier uuencodé, on tape uudecode et +pour reconstruire l'arborescence, on utilise tar zxvf fichier. +

      26. + + +
      27. &icone.solution; + +La commande suivante affiche le path complet de tous les fichiers finissant +par ~ (tilde) dans la sous-arborescence du répertoire +courant. + +
        +find . -name \( '*~' -0 'core' \) -print
        +
        + +

        +Écrivez un script qui prend en argument un nom de répertoire et qui +détruit tous les fichiers :

        + +
          + +
        1. Finissant par ~;
        2. + +
        3. Commençant et finissant par un dièse;
        4. + +
        5. S'appelant core;
        6. + +
        7. S'appelant a.out.
      28. + + + +
      29. &icone.solution; + +Écrire un sript permettant d'appliquer divers filtres sur un fichier. Ce +script est lancé avec un argument, qui doit être un nom de fichier appelé +fichier de travail; dans le cas contraire, on afficher un message d'erreur. +On attend ensuite une commande en mode interactif, qui peut être : + +
          + +
        • end : le programme s'arrête;
        • + +
        • cherche : le programme lit alors une ligne au clavier +contenant un motif et une autre contenant un nom de fichier, puis écrit +dans ce fichier les lignes du fichier de travail contenant le motif;
        • + +
        • tete oufin : le programme lit une ligne au clavier +contenant un entier n puis une ligne contenant un nom de fichier. +Il écrit ensuite les n premières (resp. dernières) lignes du +fichier de travail dans le fichier précisé;
        • + +
        • autre chose : message d'erreur.
        • + +
      30. + +
      + + +
      + Auteur : Anonyme, Joël Riou. Dernière modification le 2002-12-08. +
      + + + + diff --git a/unix/exercices/zola.tgz b/unix/exercices/zola.tgz new file mode 100644 index 0000000..8741a6a Binary files /dev/null and b/unix/exercices/zola.tgz differ