Utilisation de la commande basename dans les scripts Bash

Dans le scripting Bash, l’une des tâches les plus courantes consiste à manipuler les chemins de fichiers, en particulier lorsque vous souhaitez extraire uniquement le nom du fichier à partir d’un chemin complet. C’est là que la commande basename entre en jeu. Bien que cela semble simple, basename a des cas d’utilisation puissants lorsqu’il est utilisé correctement dans des scripts plus complexes, des outils d’automatisation, services d’hébergement et des environnements CI/CD.

Qu’est-ce que basename ?

La commande basename supprime le chemin du répertoire et, en option, retire une extension de fichier, ne laissant que le nom de base (le dernier composant d’un chemin de fichier).

🔧 Syntaxe de base :

basename [path] [suffix]

✅ Exemples simples :

basename /home/user/docs/report.pdf
basename /home/user/docs/report.pdf .pdf

Pourquoi utiliser basename dans les scripts ?

Voici quelques exemples de besoins de scripting dans le monde réel :

  • Journalisation : Extraire le nom d’un fichier journal en cours de traitement.

  • Archivage : Ajouter uniquement le nom de fichier à une archive compressée.

  • Automatisation : Traiter des lots de fichiers et générer des noms de fichiers de sortie.

  • Pipelines : Extraire des noms de fichiers dans les étapes CI/CD.

Cas d’utilisation pratiques dans les scripts Bash

📁 1. Boucle sur les fichiers avec journalisation

for file in /var/log/*.log; do
name=$(basename "$file" .log)
echo "Processing $name"
# Add further commands like gzip "$file" or tail -n 100
done

Ce script boucle sur les fichiers .log, extrait le nom sans extension et journalise chaque action. basename simplifie la gestion des noms de fichiers sans découpage complexe de chaînes.

📂 2. Utilisation de basename pour des chemins de fichiers dynamiques

Disons que vous recevez des chemins complets à partir de l’entrée utilisateur ou d’un autre processus :

#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"

Utiliser basename dans votre script garantit la flexibilité lors du travail avec des chemins de fichiers dynamiques, en particulier dans des environnements comme un VPS Linux où les journaux, les fichiers de configuration et les sauvegardes peuvent se trouver dans différents répertoires. Cela rend votre script robuste, qu’il reçoive un chemin complet comme /var/log/syslog ou un fichier relatif comme ./config.txt.

🧪 3. Combinaison de basename avec dirname

Utilisez-les ensemble pour isoler les éléments de chemin :

#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"

Suppression des extensions de fichier avec basename

Si vous souhaitez supprimer des extensions connues :

basename report-final.txt .txt

⚠️ Remarque : Cela ne fonctionne que si le suffixe correspond exactement. Donc .txt fonctionne, mais .TXT ou .tar.gz ne fonctionneront pas à moins d’être spécifiés explicitement.

Pour plusieurs extensions, combinez basename avec d’autres outils :

file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive

Ou :

filename=$(basename "${file%%.*}")

basename vs Expansion de paramètres

Bien que basename soit intuitif, il engendre un sous-processus. Pour les scripts critiques en termes de performance ou les grandes boucles, préférez les alternatives Bash pur :

Équivalent natif Bash :

file="/path/to/image.jpg"
filename="${file##*/}"
echo "$filename"
# Output: image.jpg

Supprimer l’extension avec Bash natif :

base="${filename%.*}"
echo "$base"
# Output: image

✅ Plus rapide que d’appeler basename externe.

Exemple : Renommer des fichiers en masse

Disons que vous souhaitez préfixer tous les fichiers .jpg avec la date d’aujourd’hui :


#!/bin/bash
prefix=$(date +%F)
for img in *.jpg; do
name=$(basename "$img")
mv "$img" "${prefix}_${name}"
done

Cela utilise basename pour préserver les noms d’origine tout en ajoutant une chaîne personnalisée.

Utilisez basename “$0” pour les introductions de script

echo "Running script: $(basename "$0")"

Parfait pour imprimer des sorties ou des journaux conviviaux sans chemins complets.

La commande basename est un outil fondamental pour la manipulation des chemins dans les scripts shell. Bien que simple en apparence, son intégration avec des boucles, une logique conditionnelle et une journalisation la rend inestimable dans les tâches d’automatisation et d’administration système.

Pour des scripts Bash avancés, envisagez l’expansion de paramètres pour éviter les impacts de performance dus aux appels de sous-processus. Mais pour la clarté et la portabilité—en particulier dans des environnements Unix mixtes—basename reste un classique de confiance.