glob(7) Développement des noms de fichiers

DESCRIPTION

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 une barre oblique inverse « \ », 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 utilisant cette commande :


    shopt -s nullglob

(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 rationnelles

Notez que les motifs génériques ne sont pas des expressions rationnelles 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 rationnelle, « * » signifie zéro ou plusieurs copies de l'élément précédent.

Maintenant que les expressions rationnelles 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 à « toute lettre 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 rationnelles. 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 de classement (collating element) 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 de classement définissant une classe d'équivalence dans la localisation en cours. Par exemple, « [[=a=]] » peut être équivalent à « [aáàäâ] », c'est-à-dire « [a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]] ».

COLOPHON

Cette page fait partie de la publication 3.65 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

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <[email protected]> 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> ».