Extensions et substitutions de commandes avec Bash

Utiliser Bash pour copier, supprimer, déplacer, etc. un fichier peut sembler inutile : on pourrait tout aussi bien faire ces opérations avec notre GUI. C’est vrai pour des opérations de base.

Les options de certaines commandes permettent cependant déjà d’effectuer certaines opérations plus complexes qui pourraient être difficiles à réaliser avec une interface graphique.

Cependant, l’usage de Bash pour manipuler des fichiers ne va véritablement se justifier que lorsqu’on va utiliser ce qu’on appelle des extensions à l’aide de métacaractères et d’ensembles de caractères.

Un “métacaractère” ou “joker” ou encore “wildcard” en anglais est un caractère qui représente autre chose que lui même pour Bash c’est-à-dire qui possède une signification spéciale qui va au delà du caractère qu’il représente.

Bash va “étendre” le sens littéral du caractère tapé avant qu’il soit passé à une commande. Ce procédé est appelé procédé “d’extension”.

 

Les extensions de chemin

Le premier type d’intensions que nous allons étudier sont des extensions de chemin ou “pathname expansion” en anglais. Ce type d’extension va être permis par deux métacaractères et par des classes de caractères et va nous permettre d’effectuer des recherches de correspondances.

Les métacaractères * et ?

Les deux métacaractères sont les suivants :

  • Le caractère * (étoile) permet de représenter soit aucun caractère, soit un caractère quel qu’il soit, soit un ensemble de caractères ;
  • Le caractère ? permet de représenter un caractère quelconque.

Nous allons pouvoir utiliser ces caractères en argument de nos commandes pour rechercher des fichiers par exemple.

Par exemple, si on souhaite copier tous les fichiers texte (avec une extension .txt) de notre dossier courant dans un dossier appelé “d-copie”, on pourra écrire la commande cp *.txt d-copie.

Utilisation des extensions de chemin de bash avec * et ?

Dans cet exemple, on commence par vérifier qu’on se situe bien dans le répertoire bureau. Ensuite, on crée un sous répertoire nommé “d-copie” dans le répertoire bureau puis on copie tous les fichiers texte (fichiers avec l’extension “.txt”) situés dans le répertoire bureau dans le répertoire “d-copie”.

Ici, il faut bien comprendre que le caractère * va pouvoir représenter n’importe quel caractère ou suite de caractères. Pour copier tous les fichiers texte du même dossier dont le nom commence par un a, on écrira cp a*.txt sauvegarde.

Si maintenant on veut copier tous les fichiers texte dont le nom est “cours” suivi d’un caractère exactement, on écrira plutôt cp cours?.txt sauvegarde. Ici, le caractère ? sert à représenter n’importe quel caractère unique.

Les ensembles et classes de caractères

En plus de ces deux métacaractères, Bash supporte également ce qu’on appelle des ensemble et des classes de caractères. Les ensembles de caractères sont délimités par des crochets [ ].

Les ensemble de caractères vont nous permettre de rechercher un caractère dans l’ensemble fourni. Par exemple, on peut copier les fichiers “estamper.txt” et “estomper.txt” en utilisant la commande suivante : cp est[ao]mper.txt sauvegarde.

Les classes de caractères sont des ensembles de caractères nommés. En effet, certains ensembles de caractères sont très couramment utilisés comme les ensembles [abcdefghijklmnopqrstuvwxyz] ou [0123456789] par exemple. Des ensembles nommés appelés classes ont ainsi été créés pour représenter ces ensembles afin de pouvoir les écrire plus rapidement.

Bash supporte de nombreuses classes comme alnum, alpha, ascii, blank, cntrl, digit, graph, lower, print, punct, space, upper, word et xdigit.

Les classes les plus couramment utilisées sont :

  • alnum qui représente n’importe quel caractère alphanumérique ;
  • alpha qui représente n’importe quel caractère de l’alphabet ;
  • lower qui représente n’importe quel lettre minuscule de l’alphabet ;
  • upper qui représente n’importe quel lettre majuscule de l’alphabet ;
  • digit qui représente n’importe quel chiffre.

Les classes de caractères utilisent la syntaxe [:nom-de-classe:]. Comme ce sont avant tout des ensembles de caractères, on écrira dans Bash [[:nom-de-classe:]].

Pour rechercher tous les fichiers texte dont le nom est “cours” suivi d’exactement deux chiffres, on pourra écrire cours[[:digit:]][[:digit:]].txt.

Les classes de caractères des expressions rationnelles de bash

Ici, on copie tous les fichiers texte qui sont de la forme “test[chiffre].[chiffre]” comme “test1.1.txt”, “test5.8.txt”, etc.

 

L’extension tilde

Le caractère tilde ~ permet de représenter le répertoire de base (home) d’un utilisateur.

Le tilde sera remplacé par le chemin de la racine jusqu’au répertoire home de l’utilisateur. On peut également préciser le nom d’un utilisateur derrière le tile pour étendre le répertoire home de cet utilisateur.

L'extension shell bash tilde

Vous pouvez noter ici que cd ~ et cd produisent généralement le même résultat car la commande cd nous ramène par défaut au répertoire racine de l’utilisateur.

 

L’extension accolade

L’extension accolade permet de créer différentes chaines de caractères à partir d’un schéma (= modèle = motif) contenu dans une paire d’accolades.

Les schémas valides peuvent être un ensemble de caractères simples, un ensemble de chaines séparées par des virgules, un intervalle d’entiers, etc.

Ces motifs vont également pouvoir être entourées d’un préambule (une partie avant) et d’un post-scriptum (une partie après). Pour que ces parties s’appliquent bien, il ne faudra pas ajouter d’espace entre elles et le motif principal.

L’extension accolade va pouvoir être très utile pour créer en un coup un ensemble de dossier avec un même schéma de base, pour par exemple organiser des fichiers par date.

L'extension bash accolade brace

 

La substitution de commandes

La substitution de commande est une technique qui nous permet d’utiliser le résultat d’une commande comme extension. Elle va donc nous permettre d’écrire des commandes dans d’autres commandes.

Cette technique nous permet en fait d’étendre une sous-commande en son résultat et d’utiliser immédiatement ce résultat en tant qu’argument pour une commande principale. Pour utiliser la substitution de commande, nous allons utiliser la syntaxe $(sous-commande).

La substitution de commande du shell bash

Dans cet exemple, on utilise deux commandes sur la même ligne : la commande mkdir qui permet de créer de nouveaux répertoires et la commande seq qui permet d’afficher une séquence de nombres.

On utilise la substitution de commandes pour passer le résultat de seq directement à mkdir. Ici, la commande seq va renvoyer 1 puis 2 puis 3 puis 4 puis 5. mkdir va recevoir ces résultats et créer les dossiers “1”, “2”, “3”, “4”, et “5”.

Laisser un commentaire

© Pierre Giraud - Toute reproduction interdite - Mentions légales