glob(7) Miscellaneous Information Manual glob(7) NOM glob - Developpement des noms de fichiers DESCRIPTION Il y a bien longtemps, dans UNIX V6, existait un programme nomme /etc/glob qui permettait de developper les motifs generiques dans les noms de fichiers. Ce programme devint bientot une routine interne du shell. De nos jours, on trouve egalement une routine de bibliotheque nommee glob(3) qui effectue le meme travail en etant invoquee par un programme utilisateur. Les regles de developpement sont les suivantes (POSIX.2, 3.13). Motifs generiques Une chaine est un motif generique si elle contient un ou plusieurs caracteres parmi << ? >>, << * >> et << [ >>. Le developpement (globbing) est l'operation qui transforme un motif generique en une liste de noms de fichiers correspondant a ce motif. La correspondance est definie ainsi : Un << ? >> (non inclus dans des crochets) correspond a n'importe quel caractere. Un << * >> (non inclus dans des crochets) correspond a n'importe quelle chaine, y compris la chaine vide. Classes de caracteres Une expression du type << [...] >>, dans laquelle le premier caractere apres le << [ >> n'est pas un << ! >> est mise en correspondance avec un seul des caracteres contenus entre les crochets. L'ensemble des caracteres cites ne peut pas etre vide, ainsi, le crochet fermant << ] >> peut etre present dans l'ensemble, a la condition qu'il soit en premiere place. Par consequent, la chaine << [][!] >> peut etre mise en correspondance avec l'un des trois caracteres << [ >>, << ] >> et << ! >>. Intervalles Il existe une convention particuliere, suivant laquelle deux caracteres separes par un tiret << - >> indiquent un intervalle. Ainsi, << [A-Fa-f0-9] >> equivaut a << [ABCDEFabcdef0123456789] >>. Pour inclure un tiret au sens litteral, il suffit de l'utiliser en premier ou en dernier entre les crochets. Ainsi, << []-] >> correspond uniquement aux caracteres << ] >> et << - >>, et << [--0] >> correspond aux trois caracteres << - >>, << . >> et << 0 >>, puisqu'il ne peut y avoir de correspondance avec << / >>. Negation Une expression << [!...] >> correspond a n'importe quel caractere qui ne puisse pas etre mis en correspondance avec la chaine obtenue en supprimant le << ! >> initial (ainsi, << [!]a-] >> correspond a tout caractere sauf << ] >>, << a >> et << - >>). On peut desactiver le comportement special des caracteres << ? >>, << * >> et << [ >> en les faisant preceder par une barre oblique inverse << \ >>, ou, dans le cas d'une ligne de commande shell, en les encadrant par des guillemets. Entre crochets, ces caracteres ne prennent que leur signification litterale. Ainsi, << [[?*\] >> correspond aux quatre caracteres << [ >>, << ? >>, << * >> et << \ >>. Chemins d'acces Le developpement est applique a chaque composant du chemin d'acces separement. Un << / >> dans un chemin ne peut pas etre mis en correspondance avec un << ? >> ou << * >>, ni par un intervalle tel que << [.-0] >>. Un intervalle ne peut pas contenir explicitement un caractere << / >>. Cela declencherait une erreur de syntaxe. (POSIX reclame qu'un motif soit laisse inchange s'il est syntaxiquement incorrect.) Si un nom de fichier commence par un << . >>, ce caractere doit etre mis en correspondance explicitement (ainsi, rm * ne supprimera pas .profile, et tar c * n'archivera pas tous les fichiers ; tar c .serait preferable). Listes vides La definition simple et elegante fournie plus haut << transformer un motif generique en une liste de noms de fichiers correspondants >> est la definition UNIX originale. Elle autorisait la presence de motif se developpant en listes vides, comme xv -wait 0 *.gif *.jpg alors qu'il n'y a peut-etre aucun fichier *.gif present (et on ne peut pas considerer cela comme une erreur). Toutefois, POSIX reclame qu'un motif soit laisse inchange s'il est syntaxiquement incorrect, ou si la liste des noms de fichiers correspondants est vide. On peut forcer bash a adopter le comportement classique en utilisant cette commande : shopt -s nullglob (Des problemes similaires se produisent ailleurs. Par exemple, de vieux scripts avec rm `find . -name "*~"` devraient etre remplaces par des nouveaux scripts contenant rm -f fichier-non-existant `find . -name "*~"` pour eviter les messages d'erreurs si rm est invoque avec une liste vide d'arguments). NOTES Expressions rationnelles Notez que les motifs generiques ne sont pas des expressions rationnelles bien qu'ils leur ressemblent. Tout d'abord, ils correspondent a des noms de fichiers, et pas a du texte. De plus, les conventions ne sont pas identiques. Par exemple, dans une expression rationnelle, << * >> signifie zero ou plusieurs copies de l'element precedent. Maintenant que les expressions rationnelles disposent de composants entre crochets ou la negation est indiquee par un << ^ >>, POSIX a precise que le motif generique << [^...] >> a un effet indefini. Internationalisation et classes de caracteres Bien entendu, les intervalles ont ete crees a l'origine en tant qu'intervalle ASCII ou << [ -%] >> signifie << [ !"#$%] >> et << [a-z] >> correspond a << toute lettre minuscule >>. Certaines implementations UNIX ont generalise ceci de maniere a ce que l'intervalle X-Y corresponde a l'ensemble des caracteres dont les codes se trouvent entre ceux de X et de Y. Neanmoins, ceci signifie que l'utilisateur doit connaitre le codage utilise sur le systeme local. De plus, ceci ne fonctionne pas si l'ordre de l'alphabet local n'est pas celui adopte pour le codage des caracteres. POSIX a alors etendu grandement la notation des expressions entre crochets autant pour les motifs generiques que pour les expressions rationnelles. Nous avons vu precedemment 3 types d'elements pouvant se trouver entre crochets. Plus precisement (i) une negation, (ii) des caracteres explicites, et (iii) des intervalles. POSIX specifie les intervalles d'une maniere plus utile au niveau international, et ajoute trois nouveaux types : (iii) Les intervalles X-Y comprenant tous les caracteres se trouvant entre X et Y (inclus) dans l'ordre de l'alphabet decrit par la categorie LC_COLLATE de la localisation en cours. (iv) Des classes de caracteres comme [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] Ainsi, on peut ecrire << [[:lower:]] >> a la place de << [a-z] >>, et que le comportement soit aussi valable au Danemark, ou il existe 3 lettres posterieures au << z >>. Ces classes de caracteres sont definies par la categorie LC_CTYPE des parametres regionaux actuels. (v) Les symboles groupant plusieurs lettres comme << [.ch.] >> ou << [.a-acute.] >>, dans lesquels les chaines entre << [. >> et << .] >> sont un element de classement (collating element) defini dans la localisation en cours. Il peut egalement s'agir de multicaracteres. (vi) Des classes d'equivalence comme << [=a=] >>, ou la chaine entre << [= >> et << =] >> est un element de classement definissant une classe d'equivalence dans la localisation en cours. Par exemple, << [[=a=]] >> peut etre equivalent a << [aaaaa] >>, c'est-a-dire << [a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]] >>. VOIR AUSSI sh(1), fnmatch(3), glob(3), locale(7), regex(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 glob(7)