Caractères génériques dans le shell Linux — guide complet

Liens rapides
- Que sont les caractères génériques ?
- Spécifier un caractère : “?”
- Correspondre plusieurs caractères avec “*”
- Correspondre des plages avec des crochets
- Alternance avec les parenthèses et l’opérateur |
- Exclure des correspondances avec “!” et “^”
- Désactiver les génériques avec des guillemets
- Bonnes pratiques, pièges et procédures de sécurité
Que sont les caractères génériques ?
Les caractères génériques (wildcards) sont des symboles que le shell interprète pour construire des listes de noms de fichiers. Le shell développe (expand) ces motifs en une liste de chemins correspondant au motif, puis passe la liste au programme exécuté. Les programmes eux-mêmes reçoivent la liste finale — ils ne voient pas les jokers.
Définition rapide : un “glob” est un motif contenant des jokers utilisé par le shell pour trouver des fichiers.
Important : différents shells implémentent des extensions différentes. Les opérateurs de base (“?”, ““, “[]”) sont largement supportés, mais les options avancées (comme * pour la récursivité ou les motifs étendus) nécessitent souvent d’activer une option du shell.
Spécifier un caractère : “?”
Le joker “?” correspond exactement à un caractère (un symbole, pas une chaîne vide). Exemple : pour lister des fichiers photo_01.jpg, photo_02.jpg :
ls photo.0?.jpg
Si aucun motif ne correspond, selon la configuration du shell vous obtiendrez soit le motif tel quel, soit une erreur disant qu’aucune correspondance n’a été trouvée.
Conseil : testez d’abord avec ls ou echo avant d’utiliser des commandes modifiant des fichiers.
Correspondre plusieurs caractères avec “*”
L’astérisque “*” correspond à zéro, un ou plusieurs caractères. C’est le joker le plus utilisé.
Exemples :
ls *.jpg
ls photos/*.jpg
ls *d*
ls *.p?
Récursivité :
- Dans Bash, activez la variable globstar pour utiliser “” et parcourir les sous-répertoires :
shopt -s globstar ls/*.jpg
- Dans zsh, l’opérateur “” est souvent disponible et parcourt récursivement par défaut selon les options :
ls ~/ls /usr//bin

Remarque : à cause des liens symboliques, une récursivité mal maîtrisée peut traverser des boucles ; vérifiez les options et l’impact avant d’exécuter des commandes larges.
Attention : les fichiers cachés (ceux qui commencent par un point, par exemple .bashrc) ne sont pas capturés par “*” à moins d’activer dotglob (Bash) ou d’inclure explicitement le point :
shopt -s dotglob # Bash : faire correspondre les fichiers commençant par '.'Correspondre des plages avec des crochets
Les crochets [] définissent une classe de caractères :
[abc] # a ou b ou c
[a-z] # toute lettre minuscule
[A-Z] # toute lettre majuscule
[0-9] # tout chiffre
[a-zA-Z0-9] # alphanumériqueCombiner avec d’autres jokers :
ls *.p[ly]
Les classes POSIX peuvent aussi être utiles (si prises en charge) :
[[:alpha:]] # lettre
[[:digit:]] # chiffreExpansion des accolades
Les accolades {a,b,c} ne sont pas des jokers mais une forme d’expansion (brace expansion) :
echo {cat,dog}
On peut générer des séquences avec deux points “..” :
echo {a..d}
Et pour les nombres :
echo {1..10}
Les accolades se développent avant que le shell n’applique le globbing : elles créent plusieurs mots, chacun pouvant ensuite être testé par les jokers.
Alternance avec les parenthèses et l’opérateur |
Les motifs alternatifs utilisent la syntaxe d’extension du shell (extglob) :
- Bash : activez avec shopt -s extglob
- zsh : activez avec setopt EXTENDED_GLOB
Exemples (après activation si nécessaire) :
ls *.(pl|py)
ls .*(p(l|y))Avec extglob, vous pouvez aussi utiliser des opérateurs comme +(), @(), ?(), !() pour contrôler combien d’occurrences correspondent :
- +(a|b) : une ou plusieurs occurrences de a ou b
- @(a|b) : exactement une occurrence (utile pour alternatives)
- !(a|b) : tout sauf a ou b (négation)
Remarque : la syntaxe et les noms d’options varient légèrement entre shells ; activez et testez avant usage massif.
Exclure des correspondances avec “!” et “^”
Dans une expression entre crochets, précéder par “!” ou “^” inverse la classe :
ls [!a-z]
ls [^a-z]Avec extglob, la négation globale fonctionne ainsi :
!(a|b|c)Cela correspondra à tout ce qui n’est pas a, b ou c (selon les règles du shell/option extglob).
Désactiver les génériques avec des guillemets
Si vous voulez que le shell ne développe pas un motif (par exemple pour passer une expression regex à grep ou pour afficher un motif sans expansion), utilisez des guillemets simples ou doubles. Exemple :
grep '^foo' file.txt # '^' est pris littéralement
pattern="^foo"
grep "$pattern" file.txt- Guillemets simples ‘…’ empêchent toute expansion (variables aussi).
- Guillemets doubles “…” permettent l’expansion des variables tout en protégeant les espaces et la plupart des jokers.
Différences entre globbing et expressions régulières
- Glob : syntaxe simple pour correspondre à des noms de fichiers (“*”, “?”, “[]”).
- Regex : syntaxe plus puissante et différente, utilisée par grep, sed, awk (ex : ^, $, ., +, etc.).
Ne confondez pas les deux : grep attend des regex, le shell interprète les globs.
Important : si vous passez une regex à grep, protégez-la par des guillemets pour éviter que le shell n’essaie d’interpréter des caractères spéciaux.
Quand les wildcards échouent (contre-exemples et limites)
- Les fichiers commençant par “.” ne sont pas capturés par “*” à moins d’activer dotglob ou d’inclure le point explicitement.
- Les motifs peuvent produire une erreur si aucun fichier ne correspond (selon la configuration du shell).
- Les expansions d’accolades sont effectuées avant le globbing ; des constructions inattendues sont possibles si vous mélangez les deux sans tester.
- Les comportements avec des caractères multioctets/Unicode peuvent varier selon les locales et la prise en charge du shell ; testez localement.
Bonnes pratiques et sécurité
- Testez toujours avec echo ou ls avant d’exécuter des commandes destructrices :
echo rm *.bak
ls *.bak- Utilisez l’option – pour stopper l’interprétation des arguments commençant par “-“ :
rm -- -fichier- Préférez des sauvegardes ou des copies temporaires avant de lancer des suppressions en masse.
- Pour supprimer de façon interactive :
rm -i *.txt- Pour éviter des surprises avec des espaces dans les noms, privilégiez des constructions sûres (boucles while read -r, find -print0 + xargs -0).
Procédure standard (SOP) : suppression sûre avec wildcards
- Prévisualiser : ls pattern
- Faire une sauvegarde : mkdir -p ~/backup && cp –pattern ~/backup/
- Supprimer avec confirmation interactive : rm -i pattern
- En cas d’erreur, restaurer depuis la sauvegarde
Exemple rapide :
# Prévisualiser
ls /var/log/*.log
# Sauvegarder
mkdir -p ~/backup/logs && cp /var/log/*.log ~/backup/logs/
# Supprimer (interactif)
rm -i /var/log/*.logMini-méthodologie pour construire un motif robuste
- Commencez large : echo pattern (ou ls) pour voir l’étendue.
- Réduisez avec des classes [] ou ? pour éviter les collatéraux.
- Utilisez des accolades ou alternances pour cas multiples clairement définis.
- Activez extglob/globstar uniquement si nécessaire et comprenez l’effet.
- Documentez la commande dans un script avec des commentaires.
Exemples pratiques et cas d’utilisation
- Copier tous les fichiers jpg d’un dossier :
cp photos/*.jpg /destination/- Trouver tous les scripts Perl et Python :
ls *.p[ly]- Lister récursivement tous les binaires sous /usr :
shopt -s globstar # Bash
ls /usr/**/bin- Éviter de manipuler des noms commençant par point :
shopt -s dotglob # Bash : inclure les fichiers cachés dans les jokersChecklists par rôle
Administrateur système
- Activer globstar/extglob seulement si documenté
- Tester les commandes sur un environnement de staging
- Sauvegarder avant suppression
Développeur
- Utiliser des motifs précis dans les scripts
- Échapper ou mettre entre guillemets les motifs transmis aux outils
- Écrire des tests automatisés qui couvrent le comportement des motifs
Utilisateur quotidien
- Toujours prévisualiser avec ls ou echo
- Éviter rm sans confirmation pour les motifs larges
- Connaître la différence entre glob et regex
Matrice de compatibilité simple
Shell | ?, , [], {..}, extglob, —|— Bash | oui, oui, oui, oui (brace), extglob via shopt -s extglob, via shopt -s globstar zsh | oui, oui, oui, oui, extglob via setopt EXTENDED_GLOB, souvent pris en charge ksh | oui, oui, oui, oui, extglob limité selon version, variable dash | oui, oui, oui, non pour les accolades, extglob absent, * non fish | oui, oui, oui, expansion différente; syntaxe non 100% compatible
Note : les options exactes et la disponibilité peuvent varier selon la version du shell ; consultez la page de manuel de votre shell.
Cas de test / critères d’acceptation
- Pattern : “*.txt” sur un répertoire contenant a.txt, b.log, .hidden
- Attendu : renvoie a.txt mais pas .hidden
- Pattern : “?.py” sur files [‘a.py’,’ab.py’,’1.py’]
- Attendu : correspond à a.py et 1.py seulement
- Pattern : “*/.sh” avec globstar activé
- Attendu : liste tous les .sh dans l’arborescence
Glossaire (une ligne)
- Glob : motif de correspondance de noms de fichiers utilisé par le shell.
- Wildcard : synonyme de glob, caractère générique.
- extglob : option de shell activant des opérateurs de motifs étendus.
- globstar : option permettant à “**” d’indiquer une recherche récursive.
- Brace expansion : expansion d’énumération {a,b} réalisée avant globbing.
Pièges courants et solutions
- Problème : “rm *” supprime plus que prévu. Solution : tester avec ls, utiliser rm -i ou sauvegarder.
- Problème : motifs ne correspondent pas aux fichiers cachés. Solution : activer dotglob ou lister explicitement “.*”.
- Problème : scripts qui fonctionnent sur une machine mais pas une autre. Solution : vérifier la version du shell et les options shopt/setopt.
Notes sur la sécurité et la vie privée
- Évitez d’exposer des motifs contenant des informations sensibles dans des logs non chiffrés.
- Les jokers peuvent élargir l’étendue d’une commande au-delà de l’intention ; privilégiez le moins risqué.
Résumé
Les caractères génériques sont des outils puissants pour manipuler des lots de fichiers dans les shells Unix et Linux. Maîtrisez “*”, “?”, “[]”, l’expansion des accolades, et activez extglob/globstar seulement quand nécessaire. Testez d’abord avec ls, sauvegardez avant de supprimer et adaptez votre script au shell cible.
Important : adaptez toujours vos motifs au contexte (fichiers cachés, locales, versions de shell) et préférez les commandes sûres et vérifiables.
Notes : ce guide couvre le comportement général et des bonnes pratiques ; pour des détails spécifiques à votre environnement, consultez la documentation du shell (man bash, man zsh).
Matériaux similaires
Installer et utiliser Podman sur Debian 11
Guide pratique : apt-pinning sur Debian
OptiScaler : activer FSR 4 dans n'importe quel jeu
Dansguardian + Squid NTLM sur Debian Etch
Corriger l'erreur d'installation Android sur SD