====== Les métacaractères, ou globs, ou encore patterns ======
* Objet : Les métacaractères, ou globs, ou encore patterns
* Niveau requis :{{tag>débutant avisé}}
* Commentaires : FIXME
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-)
* Suivi : {{tag>à-tester}}
* Création par [[user>MaTTuX_]] le 17/01/2009
* Testé par .... le ....
* Commentaires sur le forum : [[http://debian-facile.org/viewtopic.php?pid=113877#p113877 |C'est ici]]((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
**Nota :** Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
===== Présentation =====
Les shells de type bourne (comme **Bash**, **Zsh**, **Ksh**, **Dash**...) supportent une syntaxe
très puissante : les **globs** encore appelés **patterns**
//(glob: "global command")//((https://en.wikipedia.org/wiki/Glob_%28programming%29))
Les globs les plus basiques sont :
===== L'astérisque (*) : =====
L'astérisque signifie "n'importe quelle chaîne de n'importe quels caractères"
echo *
affiche le nom de tous les fichiers du répertoire.
==== Exemples ====
for f in *; do echo "$f"; done
Même chose, mais en faisant une boucle. Il sera affiché un fichier par ligne
mv /repertoire/*.pdf /autre/part
déplacer tout les fichiers pdf de "/repertoire" et les placer dans "/autre/part"
On notera que les fichiers dont le nom commencent par un point ne sont pas affectés par ***** . \\
//A votre avis, comment peut on faire pour les afficher aussi ?// :-)
===== Le point d'interrogation (?) : =====
Un point d'interrogation signifie "un caractère quelconque et un seul".
==== Exemples ====
Imaginons que nous nous retrouvions avec les fichiers :
ls
Affiche :
toto titi tata test tintin milou
Nous voulons n'afficher que les fichiers dont les noms font quatre lettres de longueur :
ls ????
Affiche :
tata test titi toto
----
\\
Nous aimerions maintenant afficher les fichiers toto titi et tata, mais ne pas toucher aux autres.
Nous pouvons aisément faire, par exemple :
ls t?t?
Affiche :
tata titi toto
Simple, non ? :-)
===== Les crochets ([ ]) : =====
Nous savons nous servir de *****, de **?**, très bien, mais il ne sont parfois pas assez complets pour exprimer des besoins précis.
D'où l'introduction des **expressions** **entre** **crochet** (POSIX parle de bracket expression).
Une expression entre crochets peut avoir plusieurs formes, la plus simple est la liste.
La liste ''[abcde]'' peut correspondre à n'importe quel lettre entre crochets : **a** ou **b** ou **c** ou **d** ou **e**. \\
Donc, ''[hv]elo'' peut correspondre à la chaîne de caractères ''helo'' tout comme à ''velo''.
==== Exemples ====
Poursuivons avec nos fichiers.
Nous aimerions quelque chose d'encore plus précis qu'avec ''t?t?''. \\
Pour n'afficher que ''toto'' et ''titi'' nous allons utiliser les crochets.
La liste des fichiers :
ls
Affiche :
tata titi toto test tintin milou
La commande avec les crochets :
ls t[oi]t[oi]
Affiche :
titi toto
Génial ! Mais, voyons ce qu'il se passe lorsqu'un fichier au nom inattendu montre le bout de son nez :
touch tito
Vous savez qui c'est Tito, n'est ce pas ? :-)
ls
Affiche :
tata test titi tito toto tintin milou
ls t[oi]t[oi]
Affiche :
titi tito toto
C'est déjà intéressant, mais il y a mieux : \\
la possibilité d'utiliser des ''groupes'' de lettres dans les expressions entre crochets :
ls t[a-z]t[a-z]
tata titi tito toto
===== Remarque =====
Voilà, vous avez tout en main pour comprendre les **globs** basiques.
Pour plus d'informations, n'oubliez pas le manuel :
man nom-du-programme
exemple :
man mkdir
Affiche :
NAME
mkdir - make directories
SYNOPSIS
mkdir [OPTION]... DIRECTORY...
DESCRIPTION
Create the DIRECTORY(ies), if they do not already exist.
===Avoir le man en français===
Non recommandé :
apt-get install manpages-fr
Plus tard nous verrons quelques concepts de **globs** plus avancés.
===== Liens =====
* [[:doc:programmation:shell:regexp | regexp ou Regular Expression ou Expression Régulière]]