HOWTO · Bash
Supprimer l'extension de fichier à l'aide de Bash
Supprimez le suffixe final d’un nom de fichier avec l’expansion de paramètres de Bash, utilisez `basename` pour un suffixe connu et `cut` pour extraire des champs de texte délimité.
Sur cette page
Pour supprimer le suffixe final d’une chaîne contenant un nom de fichier dans Bash, utilisez l’expansion de paramètres : name="${file%.*}". Le motif %.* supprime la plus courte correspondance d’un point suivi de n’importe quels caractères à la fin de la chaîne ; les points précédents sont donc conservés. Cette opération ne modifie que la chaîne : elle ne renomme pas le fichier sur le disque.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
file='annual.report.html'
name="${file%.*}"
printf '%s\n' "$name"
Supprimer un suffixe avec l’expansion de paramètres de Bash
L’expansion de paramètres est généralement le choix le plus simple lorsque le nom de fichier se trouve déjà dans une variable Bash. Elle ne nécessite ni commande externe ni pipeline. Affectez le résultat à une nouvelle variable pour conserver la valeur d’origine, ou réaffectez-le à la même variable si vous n’en avez plus besoin. Mettez les expansions de variables entre guillemets afin que les espaces et les caractères génériques restent inclus dans le texte du nom de fichier.
Le motif supprime le point final et tout ce qui le suit. Par exemple, appliqué à annual.report.html, il donne annual.report ; appliqué à notes, il laisse notes inchangé, car aucun point ne correspond. Avec ce motif, un nom commençant par un point, comme .profile, devient une chaîne vide : traitez séparément les fichiers commençant par un point s’ils font partie de vos données. Cette règle est purement textuelle : elle ne détermine pas si un suffixe correspond à un type de fichier réel.
Utiliser basename lorsque le suffixe est connu
Utilisez basename lorsque vous connaissez exactement le suffixe à supprimer. Son deuxième argument est un suffixe retiré uniquement s’il correspond à la fin du nom. Par exemple, basename "$file" .html transforme annual.report.html en annual.report. Si le nom se termine par .HTML ou par un autre suffixe, .html ne correspond pas et celui-ci est conservé. Mettre la variable entre guillemets protège également les espaces dans la valeur d’entrée.
basename est une commande externe ; pour une valeur déjà stockée dans une variable Bash, son usage est donc moins direct que l’expansion de paramètres. Elle est utile lorsque vous voulez précisément retirer un suffixe connu. Aucune de ces deux méthodes ne modifie le fichier sur le disque.
Utiliser cut pour du texte délimité, pas pour supprimer les suffixes de noms de fichier en général
La commande cut sert à sélectionner des champs dans du texte séparé par un délimiteur. Avec cut -d '.' -f 1, chaque ligne d’entrée est découpée aux points et seul le premier champ est conservé. Cette méthode peut convenir pour traiter une liste lorsque la règle recherchée est « conserver le texte avant le premier point ». Ce n’est pas une méthode générale pour supprimer le suffixe final d’un nom de fichier : annual.report.html devient annual, et .report ainsi que .html sont perdus.
Pour traiter une liste séparée par des retours à la ligne, transmettez le texte à cut dans un pipeline, par exemple : printf '%s\n' "$file" | cut -d '.' -f 1. L’option -d choisit le délimiteur et -f 1 sélectionne le premier champ. Utilisez cut lorsque l’entrée est structurée autour d’un délimiteur et que cette sélection de champ est bien celle que vous voulez. Pour supprimer un suffixe final, préférez l’expansion de paramètres de Bash.
Traiter les noms de fichier comportant plusieurs points et choisir une méthode
Un nom de fichier comportant plusieurs points met clairement en évidence la différence. Pour archive.part.tar.gz, ${file%.*} supprime uniquement .gz et laisse archive.part.tar ; basename "$file" .gz produit le même résultat lorsque .gz est le suffixe connu ; cut -d '.' -f 1 ne conserve que archive. Choisissez l’expansion de paramètres pour supprimer le suffixe final, basename pour un suffixe connu et cut pour sélectionner un champ délimité. Ces exemples transforment du texte contenant un nom de fichier ; renommer une entrée du système de fichiers nécessite une opération distincte.