Guide des technologies

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

9 min read Shell Mis à jour 17 Sep 2025
Caractères génériques dans le shell Linux
Caractères génériques dans le shell Linux

Mascotte Linux utilisant un ordinateur portable avec plusieurs terminaux multiplexés autour

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

Correspondance d'un caractère unique avec ls utilisant le joker '?'

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?

Correspondance de plusieurs fichiers avec ls utilisant le joker '*'

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

Liste récursive zsh du répertoire /usr avec l'opérateur '</strong>'

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érique

Combiner avec d’autres jokers :

ls *.p[ly]

Liste ls de scripts Perl et Python utilisant des crochets pour les motifs

Les classes POSIX peuvent aussi être utiles (si prises en charge) :

[[:alpha:]]   # lettre
[[:digit:]]   # chiffre

Expansion des accolades

Les accolades {a,b,c} ne sont pas des jokers mais une forme d’expansion (brace expansion) :

echo {cat,dog}

Affichage des mots 'cat' et 'dog' via expansion des accolades

On peut générer des séquences avec deux points “..” :

echo {a..d}

Affichage des lettres a à d via expansion des accolades

Et pour les nombres :

echo {1..10}

Affichage des nombres 1 à 10 via expansion des accolades

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

  1. Prévisualiser : ls pattern
  2. Faire une sauvegarde : mkdir -p ~/backup && cp –pattern ~/backup/
  3. Supprimer avec confirmation interactive : rm -i pattern
  4. 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/*.log

Mini-méthodologie pour construire un motif robuste

  1. Commencez large : echo pattern (ou ls) pour voir l’étendue.
  2. Réduisez avec des classes [] ou ? pour éviter les collatéraux.
  3. Utilisez des accolades ou alternances pour cas multiples clairement définis.
  4. Activez extglob/globstar uniquement si nécessaire et comprenez l’effet.
  5. 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 jokers

Checklists 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).

Auteur
Édition

Matériaux similaires

Installer et utiliser Podman sur Debian 11
Conteneurs

Installer et utiliser Podman sur Debian 11

Guide pratique : apt-pinning sur Debian
Administration système

Guide pratique : apt-pinning sur Debian

OptiScaler : activer FSR 4 dans n'importe quel jeu
Jeux PC

OptiScaler : activer FSR 4 dans n'importe quel jeu

Dansguardian + Squid NTLM sur Debian Etch
réseau

Dansguardian + Squid NTLM sur Debian Etch

Corriger l'erreur d'installation Android sur SD
Android, Dépannage

Corriger l'erreur d'installation Android sur SD

KNetAttach et remote:/ — Dossiers réseau KDE
Tutoriel

KNetAttach et remote:/ — Dossiers réseau KDE