Travaux Pratiques n°2

Instructions

Ces travaux pratiques sont à effectuer seul et un compte-rendu (réponses aux questions plus tout commentaire supplémentaire que vous jugerez utile) est à envoyer à serpaggi@emse.fr dès la fin de la séance de TP.

Pour faciliter la réception et le traitement, le message devra avoir un sujet (Sujet ou Objet selon le logiciel utilisé) formaté comme suit :
[MSGL Shell] TP2 Prénom Nom.

Utilisation des commandes courantes

Le but de ces TP est de vous familiariser avec les commandes les plus rencontrées lorsqu'on écrit des scripts shell.

En général, lorsqu'on utilise un shell et que l'on écrit des scripts, on se retrouve souvent à traiter du texte, c'est pour cela que les commandes que nous allons présenter ici excellent dans ce domaine.

Trouver la bonne documentation

Ces travaux pratique demandent de lire et comprendre beaucoup de pages de manuel des différentes commandes du système. Cela fait partie de l'exercice, n'hésitez pas à y passer du temps.

basename, dirname

Ces deux commandes sont très proches l'une de l'autre et permettent de découper une chaîne de caractères par ses extrémités. Ces deux commandes sont extrêmement simples d'utilisation et ne comportent pas d'option.

Pour faire vite, basename supprime le début d'une chaîne de caractères jusqu'au dernier / (slash) et dirname supprime la fin d'une chaîne de caractère, à partir du dernier /.

Pour une chaîne STR donnée, la réunion des deux chaînes de caractères retournées par dirname STR et basename STR, avec le signe /, est égale à la chaîne STR originale.

La commande basename permet également de supprimer un suffixe à son argument.

Exercice :

Pour vous familiariser avec ces deux fonctions, donnez le nom du répertoire courant et du chemin menant à ce répertoire à partir de la variable PWD.

Ces deux commandes ne sont pas prévues pour être utilisées comme filtres, elles ne peuvent donc pas être utilisées ailleurs qu'à la première place d'un tube de commandes. Et là, faut-il encore trouver un exemple d'utilisation qui mette ça en valeur.

cut

L'utilitaire cut(1) permet, comme son nom l'indique, de découper ce qu'il reçoit en entrée selon un schéma simple.

Pour cut, le monde se divise en deux catégories : le séparateur de champs et les champs. Il permet donc de découper un ensemble de phrases au niveau de chaque séparateur. Par exemple, le tronçonnage du fichier /etc/passwd est facilement réalisable avec cut.

Exercice :

  1. En vous aidant de la page de manuel de cut(1), donnez les noms, les numéro d'utilisateur et de groupe des utilisateurs du système (informations à rechercher dans le fichier /etc/passwd dont chaque ligne est structurée de la façon suivante : login:password:UID:GID:comment:home directory:shell).
  2. Est-il possible avec cut d'analyser efficacement la sortie de la commande ls et pourquoi ?
  3. Quel traitement pourrait-on imaginer faire subir à la sortie de ls pour que cut puisse facilement l'analyser ?

sort

L'utilitaire sort(1) est un filtre permettant de trier une liste. Le tri peut s'effectuer par ordre alphabétique ou numérique et peut être inversé.

La syntaxe de la commande sort est la suivante :

Syntaxe

sort [options] <fichier>...

La sortie se fait sur la sortie standard.

Exercice :

En vous aidant des utilitaires ls, sort et wc déterminez s'il y a des commandes qui portent le même nom dans les répertoires /bin et /sbin. On ne demande pas de savoir quelles sont ces commandes, juste de savoir si oui ou non il y en a qui sont communes et éventuellement d'en donner le nombre.

Pour cela, on pourra compter le nombre total de commandes et le nombre total de commandes uniques et comparer.

grep

L'utilitaire grep(1) permet de retrouver les lignes d'un fichier, ou un ensemble de fichiers, qui contiennent une chaîne de caractères donnée.

La syntaxe de la commande est :

Syntaxe

grep [options] <format> <fichier>...

<format> représente la chaîne de caractère à rechercher. Ça peut être une expression régulière.

Ce que l'on fouille c'est donc le contenu du fichier et pas le nom du fichier. De ce fait, on pourra avoir des comportements étranges si l'on tombe sur des fichiers binaires (sachez comment réinitialiser votre terminal, ça peut être utile).

Exercice :

En vous aidant de la page de manuel de grep(1) :

  1. Affichez toutes les variables du shell qui contiennent votre nom de login.
  2. Donnez les noms de tous les fichiers du répertoire /etc qui contiennent le mot passwd.
  3. Trouvez tous les fichiers de votre répertoire personnel contenant des lignes vides.
  4. Peut-on avoir, de manière simple, le nom des fichiers ne contenant pas une chaîne donnée ?

find

L'utilitaire find(1) permet de rechercher les fichiers répondants à des critères donnés.

find permet de filtrer de manière assez précise les fichiers à prendre en compte. Cela concerne le nom du fichier, son type, la date de sa création, de son dernier accès, ...

Les filtres peuvent être combinés en opérations logiques et/ou avoir leur signification inversée.

La syntaxe (générale et simplifiée) de find est la suivante :

Syntaxe

find <rep> <filtres>

<rep> représente le nœud dans l'arborescence des fichiers qui va être le point de départ de la recherche et <filtres> est un ensemble de filtres permettant de sélectionner les fichiers désirés.

Exercice :

En vous aidant de la page de manuel de find(1) et éventuellement de votre prof, essayez de répondre aux question suivantes :
  1. Faires la liste de tous les répertoires sous votre répertoire personnel.
  2. Chercher tous les fichiers qui ne sont pas lisibles ni par le groupe ni par les autres.
  3. Trouver dans les répertoires /tmp et /var/tmp tous les fichiers qui n'ont pas été accédés depuis puis de 10 jours.
  4. Chercher vos fichiers qui n'ont pas été accédés depuis plus de 5 jours.
  5. Chercher les fichiers de votre répertoire personnel auxquels vous avez accédé depuis moins de 5 jours.
  6. Trouver les fichiers et répertoires dont le nom contient "fr" et qui sont situés sous le répertoire /etc. On redirige les erreurs vers /dev/null pour avoir une sortie plus claire.
  7. Même chose que précédemment, mais on ne s'intéresse qu'aux fichiers.
  8. Trouver dans le répertoire /var/tmp tous les fichiers qui ont été accédés aujourd'hui et qui n'ont pas la chaîne "tmp" dans leur nom.
  9. Trouver les fichiers de votre répertoire personnel dont le nom ne se termine ni pas ".c" ni par ".h".
  10. ATTENTION : cet exercice comporte des risques. Faites plusieurs essais pour vous assurer de la validité de la réponse (recherche des fichiers, puis recherche avec effacement).
    Effacer tous les fichiers, dans votre sous-arborescence, dont le nom est core.

xargs

La commande xargs permet de passer en paramètre à une autre commande une liste de fichiers à traiter qui est très volumineuse et qui, normalement, serait trop grande pour être gérée normalement par le shell.

Au lieu de passer une très longue liste de n arguments à une commande, xargs invoque n fois la commande en question avec un argument différent à chaque fois.

Sa syntaxe est particulière et en voici un exemple, permettant de déplacer tous les fichiers du répertoire $src vers le répertoire $dst :

#> ls $src | xargs -I {} -t mv $src/{} $dst/{}
...
#>

La syntaxe de xargs est la suivante (version simplifiée) :

Syntaxe

commande | xargs [options]... <commandes> [arguments de la commande]...

Exercice :

En vous inspirant de cet exemple et de la page de manuel de xargs, donnez la liste de tous les fichiers présents dans vos sous répertoires (uniquement les noms de fichiers). Vous pouvez utiliser les commandes ls et basename.

sed

L'étude de sed sera l'objet de TP sur les expressions régulières.