Bonjour à tous,
Merci pour vos réponses.
D'abord, un petit point de contexte.
Le problème se produit quand des caractères sont encodés sur 2 bytes (UTF-8, par exemple), puis interprétés suivant des normes qui encodent les caractères sur un byte uniquement (Windows-1252 ou ISO-8859-1).
C'est le cas, par exemple, si une page web est encodée suivant la norme UTF-8, et que le serveur web déclare erronément le charset comme étant ISO-8859-1 dans le protocole http qui délivre la page au navigateur :
Le navigateur va alors afficher chaque byte de la page comme un caractère de type Latin-1. C'est-à-dire que les caractères accentués, stockés sur deux bytes, vont être affichés comme deux caractères n'ayant rien à voir avec le caractère accentué à afficher.
C'est un problème fréquent, qui a donné lieu sur ce forum a des posts précédents.
Malheureusement pour moi, j'hérite de fichiers (plusieurs centaines de milliers !) qui à un moment ou à un autre ont été copiés par un logiciel/un protocole où ce problème d'encodage est intervenu dans la chaîne du traitement : ces erreurs d'interprétation sont maintenant enregistrées "en dur" dans le nom de mes fichiers - tout caractère accentué a été remplacé par deux caractères.
Pour répondre aux doutes de Disedorgue, le problème n'est pas qu'une question de simple réglage sur l'encodage reconnu par le terminal, car de nouveaux fichiers contenant des caractères accentués sont affichés correctement, alors que tous les "anciens" ne le sont pas, et ce, que j'accède au répertoire via une session ssh/bash ou l'explorateur Windows -- les fichiers étant stockés sur un système NAS.
La table de correspondance exhaustive entre les caractères accentués et les signes "cabalistiques" associés est disponible à l'adresse suivante.
J'ai bien noté la suggestion d'utiliser sed pour renommer lesdits fichiers, intégré à un script bash. Je veux bien des suggestions de scripts, si un expert sed tombe par chance sur ces lignes :-)
Sinon, j'ai trouvé sur le net des exemples de scripts pouvant servir de début de solution.
Par exemple, ces deux extraits scripts bash qui remplacent tous les espaces " " dans un nom de fichier par le caractère "_" :
1er exemple
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
2e exemple
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
Merci d'avance de vos avis et suggestions de solutions.
Bonne journée,
Kalisthos
Partager