Défi
Énoncé
Écrire un script bash qui parcourt tous les fichiers du répertoire courant (non récursif, pas les dossiers) et renomme chacun d'eux en remplaçant les lettres majuscules de leur nom par les minuscules correspondantes. L'extension est traitée comme le reste du nom : README.TXT devient readme.txt. Si le nom cible existe déjà (et est différent du fichier source), le script affiche un avertissement sur stderr et ignore ce fichier. Les noms contenant des espaces doivent être traités correctement : c'est le piège central de l'exercice.
Contraintes
- Ne traiter que les fichiers ordinaires (pas les répertoires, liens symboliques, etc.).
- Un nom de fichier peut contenir des espaces : la boucle et l'appel à
mvdoivent rester corrects dans ce cas. - Utiliser
tr '[:upper:]' '[:lower:]'ou la substitution bash${var,,}pour la conversion. - Un fichier dont le nom est déjà entièrement en minuscules ne doit pas être renommé (éviter un
mvinutile). - Messages d'avertissement sur stderr, pas sur stdout.
- Compatible bash 4+ (pour
${var,,}) ou bash 3 avectr.
Exemple
Arborescence avant exécution :
Rapport.txt Notes.TXT archive.zip Config.SH Mon Rapport.MD
Exécution :
$ bash minuscules.sh
Arborescence après exécution :
rapport.txt notes.txt archive.zip config.sh mon rapport.md
Si rapport.txt existait déjà avant le renommage de Rapport.txt :
avertissement : rapport.txt existe déjà, Rapport.txt ignoré