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.
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.
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.
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.
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.
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.
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 :
sort [options] <fichier>...
La sortie se fait sur la sortie standard.
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.
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 :
grep [options] <format> <fichier>...
où <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).
En vous aidant de la page de manuel de grep(1) :
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 :
find <rep> <filtres>
où <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.
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) :
commande | xargs [options]... <commandes> [arguments de la commande]...
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.
L'étude de sed sera l'objet de TP sur les expressions régulières.