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 << - >>).
One can remove the special meaning of '?', '*', and '[' by preceding
them by a backslash, or, in case this is part of a shell command line,
enclosing them in quotes. Between brackets these characters stand for
themselves. Thus, "[[?*\]" matches the four characters '[', '?', '*',
and '\'.
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.9.1 15 juin 2024 glob(7)