NOM
glob - Développement des noms de fichiers
Il y a bien longtemps, dans Unix V6, existait un programme nommé
/etc/glob qui permettait de développer les motifs génériques dans les
noms de fichiers. Ce programme devint bientôt une routine interne du
shell.
De nos jours, on trouve également une routine de bibliothèque nommée
glob(3) qui effectue le même travail en étant invoquée par un programme
utilisateur.
Les règles de développement sont les suivantes (POSIX.2, 3.13).
Motifs génériques
Une chaîne est un motif générique si elle contient un ou plusieurs
caractères parmi « ? », « * » et « [ ». Le développement (globbing) est
l’opération qui transforme un motif générique en une liste de noms de
fichiers correspondant à ce motif. La correspondance est définie
ainsi :
Un « ? » (sans les guillemets) correspond à n’importe quel caractère.
Un « * » (sans les guillemets) correspond à n’importe quelle chaîne, y
compris la chaîne vide.
Classes de caractères
Une expression du type « [...] », dans laquelle le premier caractère
après le « [ » n’est pas un « ! » est mise en correspondance avec un
seul des caractères contenus entre les crochets. L’ensemble des
caractères cités ne peut pas être vide, ainsi, le crochet fermant « ] »
peut être présent dans l’ensemble, à la condition qu’il soit en
première place. Par conséquent, la chaîne « [][!] » peut être mise en
correspondance avec l’un des trois caractères « [ », « ] » et « ! ».
Intervalles
Il existe une convention particulière, suivant laquelle deux caractères
séparés par un tiret « - » indiquent un intervalle. Ainsi,
«[A-Fa-f0-9] » équivaut à « [ABCDEFabcdef0123456789] ». Pour inclure un
tiret au sens littéral, il suffit de l’utiliser en premier ou en
dernier entre les crochets. Ainsi, « []-] » correspond uniquement aux
caractères « ] » et « - », et « [--0] » correspond aux trois caractères
« - », « . » et « 0 », puisqu’il ne peut y avoir de correspondance avec
« / ».
Négation
Une expression « [!...] » correspond à n’importe quel caractère qui ne
puisse pas être mis en correspondance avec la chaîne obtenue en
supprimant le « ! » initial. (ainsi, « [!]a-] » correspond à tout
caractère sauf « ] », « a » et « - ».)
On peut désactiver le comportement spécial des caractères « ? », « * »
et « [ » en les faisant précéder par un backslash « \ », ou, dans le
cas d’une ligne de commande shell, en les encadrant par des guillemets.
Entre crochets, ces caractères ne prennent que leur signification
littérale. Ainsi, « [[?*\] » correspond aux quatre caractères « [ »,
« ? », « * » et « \ ».
Chemins d’accès
Le développement est appliqué à chaque composant du chemin d’accès
séparément. Un « / » dans un chemin ne peut pas être mis en
correspondance avec un « ? » ou « * », ni par un intervalle tel que
« [.-0] ». Un intervalle ne peut pas contenir explicitement un
caractère « / ». Ceci déclencherait une erreur de syntaxe.
Si un nom de fichier commence par un « . », ce caractère doit être mis
en correspondance explicitement. (Ainsi, rm * ne supprimera pas
.profile, et tar c * n’archivera pas tous les fichiers ; tar c .serait
préférable.)
Listes vides
La définition simple et élégante fournie plus haut « transformer un
motif générique en une liste de noms de fichiers correspondants » est
la définition Unix originale. Elle autorisait la présence de motif se
développant en listes vides, comme
xv -wait 0 *.gif *.jpg
alors qu’il n’y a peut-être aucun fichier *.gif présent (et on ne peut
pas considérer cela comme une erreur). Toutefois, POSIX réclame qu’un
motif soit laissé inchangé s’il est syntaxiquement incorrect, ou si la
liste des noms de fichiers correspondants est vide. On peut forcer bash
à adopter le comportement classique en positionnant la variable
d’environnement allow_null_glob_expansion=true.
(Des problèmes similaires se produisent ailleurs. Par exemple, de vieux
scripts avec
rm `find . -name "*~"`
devraient être remplacés par des nouveaux scripts contenant
rm -f fichier-non-existant `find . -name "*~"`
pour éviter les messages d’erreurs si rm est invoqué avec une liste
vide d’arguments).
NOTES
Expressions régulières
Notez que les motifs génériques ne sont pas des expressions régulières
bien qu’ils leur ressemblent. Tout d’abord, ils correspondent à des
noms de fichiers, et pas à du texte. De plus, les conventions ne sont
pas identiques. Par exemple, dans une expression régulière, « * »
signifie zéro ou plusieurs copies de l’élément précédent.
Maintenant que les expressions régulières disposent de composants entre
crochets où la négation est indiquée par un « ^ », POSIX a précisé que
le motif générique « [^...] » a un effet indéfini.
Internationalisation et classes de caractères.
Bien entendu, les intervalles ont été créés à l’origine en tant
qu’intervalle ASCII où « [ -%] » signifie « [ !"#$%] » et «[a-z] »
correspond à « tout caractère minuscule ». Certaines implémentations
Unix ont généralisé ceci de manière à ce que l’intervalle X-Y
corresponde à l’ensemble des caractères dont les codes se trouvent
entre ceux de X et de Y. Néanmoins, ceci signifie que l’utilisateur
doit connaître le codage utilisé sur le système local. De plus, ceci ne
fonctionne pas si l’ordre de l’alphabet local n’est pas celui adopté
pour le codage des caractères. POSIX a alors étendu grandement la
notation des expressions entre crochets autant pour les motifs
génériques que pour les expressions régulières. Nous avons vu
précédemment 3 types d’éléments pouvant se trouver entre crochets. Plus
précisément (i) une négation, (ii) des caractères explicites, et (iii)
des intervalles. POSIX spécifie les intervalles d’une manière plus
utile au niveau international, et ajoute trois nouveaux types:
(iii) Les intervalles X-Y comprenant tous les caractères se trouvant
entre X et Y (inclus) dans l’ordre de l’alphabet décrit par la
catégorie LC_COLLATE de la localisation en cours.
(iv) Des classes de caractères comme
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
Ainsi, on peut écrire « [[:lower:]] » à la place de « [a-z] », et que
le comportement soit aussi valide au Danemark, où il existe 3 lettres
postérieures au « z ». Ces classes de caractères sont définies par la
catégorie LC_CTYPE de la localisation en cours.
(v) Les symboles groupant plusieurs lettres comme « [.ch.] » ou
«[.a-acute.] », dans lesquels les chaînes entre « [. » et « .]» sont un
élément défini dans la localisation en cours. Il peut également s’agir
de multicaractères.
(vi) Des classes d’équivalence comme « [=a=] », où la chaîne entre
«[= » et « =] » est un élément définissant une classe d’équivalence
dans la localisation en cours par exemple « [[=a=]] » peut être
équivalent à « [a] » (Latin-1), c’est à dire
«[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]] ».
VOIR AUSSI
sh(1), fnmatch(3), glob(3), locale(7), regex(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».