[bash]Supprimer les accents dans les noms de fichier(résolu)

Applications, problèmes de configuration réseau
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

[bash]Supprimer les accents dans les noms de fichier(résolu)

Message par karhu »

Le Français est une belle langue, mais pas toujours adaptée à l'informatique ou tout du moins l'informatique ne fait pas d'effort pour s'adapter au français.
Dans beaucoup de titres de chansons il y a des accents et je souhaiterais les supprimer automatiquement. J'ai écrit une petite fonction en bash que je vous livre.

Code : Tout sélectionner

#!/bin/bash

for i in *			# les fichiers du répertoire
do
  nom="";			# nouveau nom
  typeset -i j="0";		# index des lettres du nom du fichier
  while [ $j -ne ${#i} ];	# longueur du nom du fichier
  do
    case "${i:$j:1}" in		# translation
      à|â)	nom="${nom}a";;
      À|Â])	nom="${nom}A";;
      é|è|ê|ë)	nom="${nom}e";;
      É|È|Ê|Ë)	nom="${nom}E";;
      î|ï)	nom="${nom}i";;
      Î|Ï)	nom="${nom}I";;
      ô|ö)	nom="${nom}o";;
      Ô|Ö)	nom="${nom}O";;
      ù|û)	nom="${nom}u";;
      Ù|Û)	nom="${nom}U";;
      ç)	nom="${nom}c";;
      Ç)	nom="${nom}C";;
      *)	nom="${nom}${i:$j:1}";;
    esac
    j=j+1;
  done
    echo -e " $i = $nom";	# pour tester avant le "mv"
done
echo -e "";
J'ai constaté deux problèmes :
1) c'est toujours le cas *) qui est pris !
2) il semblerait aussi x|y) ne fonctionne pas. Je l'ai testé avec x) et y) qui eux fonctionnent.
Autre chose ne fonctionnant pas non plus.

Code : Tout sélectionner

 tr '[àâäéèêëôöîïùûü]' '[aaaeeeeiioouuu]'
 et
 sed 'y/àâçéèêëôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ/aaceeeeiioouuAACEEEEIIOOUU/'
Je sais que cela fonctionne en tcl (csh, tcsh ?), en php et je crois en java.
Une idée ? Ou un autre moyen (léger) de faire cette translation ?
Dernière modification par karhu le mer. 04 janv. 2012, 18:42, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

Il faudrait savoir dans quel encodage sont les nom de tes fichiers ?
Ton script est encodé et exécuté avec quel encodage ?
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [bash]Suppression des accents dans les noms de fichier

Message par tuxce »

Il faudrait surtout savoir le système de fichiers utilisé (ainsi que les options de montage).
Contrairement à ext* qui stocke les caractères qu'on lui donne et donc avec l'encodage du système, *fat et ntfs stocke aussi l'encodage utilisé et du coup, l'encodage dépend de l'option donnée au montage (quand on a crée le fichier et quand on le lit).
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

@tuxce Tu m’intéresses :-) Je n'ai pas bien compris les différences. Lesquels des systèmes de fichier enregistre le nom de manière brut (raw) ? Certains encodent derrière en unicode (16 ou 32 bits) ?
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [bash]Suppression des accents dans les noms de fichier

Message par tuxce »

*fat et ntfs prennent l'option utf8 et/ou iocharset pour déterminer et éventuellement convertir l'encodage des noms.
ext* stocke en brut.
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [bash]Suppression des accents dans les noms de fichier

Message par karhu »

Mon système de fichiers principal est xfs. j'ai aussi de l'etx2 et de l'etx3. je suis en x86_64.
Mon petit script (avant de le transformer en fonction) vient d'être écrit à l'aide de gedit. Le test est fait dans mon répertoire de travail où j'ai créé avec touch des fichiers bidons contenant des accents dans leur nom.
J'y suis depuis le début d'après-midi et j'ai tenté pas mal de trucs plus ou moins géniaux.
Le dernier en date était :

Code : Tout sélectionner

  if [ ${i:$j:1} == "à" ];
  then
    echo -e "\n youpi\n";
  fi
résultat

Code : Tout sélectionner

./direct: ligne 8 : [: == : opérateur unaire attendu
./direct: ligne 8 : [: == : opérateur unaire attendu
..................
./direct: ligne 8 : [: == : opérateur unaire attendu
./direct: ligne 8 : [: == : opérateur unaire attendu
./direct: ligne 8 : [: == : opérateur unaire attendu
^C
PS: l'avantage de mon script originel est qu'il ne fait rien, mais il ne plante pas. :D
Dernière modification par karhu le mar. 03 janv. 2012, 18:29, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [bash]Suppression des accents dans les noms de fichier

Message par FoolEcho »

Ça ne répond pas tout à fait à ta question (mais ça va plus vite que de tester le script :sifflote2:), mais tu as convmv pour changer l'encodage d'un nom de fichier vers un autre encodage (parce que d'la'zut, on a droit à nos accents quand même ! :D ) (et tant que j'y suis: iconv pour le contenu, par contre il faut passer par un fichier temporaire pour écraser l'original).
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

Je pense que tu essaye de contourné un problème au lieu de le résoudre à la racine.
Si j'ai bien compris d'après un autre sujet quand tu enregistre un fichier avec gedit dont le nom contient des accent, alors tu as des problèmes => Cela ne devrait pas arriver !!!
Donc je pense qu'il faut essayer de se concentrer sur ce point, au lieu de bricoler

Si tu enregistre avec gedit un fichier dont le nom faut : testé qu'est ce qu’affiche nautilus et via une console bash (retour de la commande ls)
Si tu enregistre avec touch via la console un fichier dont le nom faut : testé qu'est ce qu’affiche nautilus et via une console bash (retour de la commande ls)
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [bash]Suppression des accents dans les noms de fichier

Message par FoolEcho »

benjarobin a écrit :Si j'ai bien compris d'après un autre sujet quand tu enregistre un fichier avec gedit dont le nom contient des accent, alors tu as des problèmes => Cela ne devrait pas arriver !!!
Donc je pense qu'il faut essayer de se concentrer sur ce point, au lieu de bricoler
+1 avec benjarobin. Comme tu n'as pas précisé, j'ai hâtivement pensé que ces fichiers venaient d'ailleurs (et donc que le problème était ponctuel). :chinois:
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [bash]Suppression des accents dans les noms de fichier

Message par karhu »

@Benjarobin Non, je me suis mal exprimé.
J'ai créé mon script avec gedit sans accent, ceux sont les fichiers de test que je crée à l'aide de touch avec des accents.
@Foolecho pour utiliser convmv je dois seulement connaitre le type d'encodage du fichier, je suppose que c'est pareil pour son nom. Tu peux me rappeler comment faire, STP. :oops:
Pour des fichiers importés (chansons) d'accord, mais pour mes propres fichiers cela devrait marcher.
Je pense que mon bash a un problème avec les caractères spéciaux, peut-être une variable locale mal initialisée, genre LC_ALL qui est vide chez moi ?
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [bash]Suppression des accents dans les noms de fichier

Message par tuxce »

/me avait mal compris la question :|
Tu n'as pas un souci avec les accents, tu veux juste les virer ...
Autant pour moi, j'ai mal lu.

Sinon, ton script bash, le j=j+1, ça fait ce que tu souhaites faire :)

Code : Tout sélectionner

$ j=0
$ j=j+1
$ echo $j
j+1
(je regarderai plus tard, là pas le temps :?)
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [bash]Suppression des accents dans les noms de fichier

Message par karhu »

Oui il est bien incrémenté, mais il ne faut pas oublié de le déclarer en integer

Code : Tout sélectionner

  typeset -i j="0";		# index des lettres du nom du fichier
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [bash]Suppression des accents dans les noms de fichier

Message par FoolEcho »

karhu a écrit :pour utiliser convmv je dois seulement connaitre le type d'encodage du fichier, je suppose que c'est pareil pour son nom. Tu peux me rappeler comment faire, STP. :oops:
C'est là que le bât blesse... Pour le contenu, on peut utiliser file -i et regarder le charset... Pour le nom, ça existe peut-être mais je ne connais pas de méthode directe (en général, on connaît l'encodage utilisé): si on l'ignore, je crains qu'il faille faire un echo du nom de fichier dans un fichier et vérifier le charset obtenu avec iconv... :?
De toutes manières, convmv comme iconv ne font pas de changements directement, donc tu peux tester tranquille.
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

Désolé j'insiste jusqu'au bout
karhu a écrit :ceux sont les fichiers de test que je crée à l'aide de touch avec des accents.
=>
benjarobin a écrit :Si tu enregistre avec touch via la console un fichier dont le nom faut : testé qu'est ce qu’affiche nautilus et via une console bash (retour de la commande ls)
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [bash]Suppression des accents dans les noms de fichier

Message par karhu »

Voici les deux sorties de mon répertoire :
ls -lA

Code : Tout sélectionner

-rwxr--r-- 1 iohan users 1467  8 mars   2005 create_splash.sh
-rw-r--r-- 1 iohan users    0  3 janv. 15:37 ÇyiLÈà
-rwxr--r-- 1 iohan users  707  3 janv. 18:26 direct
-rwxr-xr-x 1 iohan users  196  7 mars   2006 essai.tcl
-rw-r--r-- 1 iohan users    0  3 janv. 15:36 éu_K
-rwxr-xr-x 1 iohan users  391 14 févr.  2009 loop.sh
-rwxr-xr-x 1 iohan users  641  4 mars   2006 mp32wav
-rwxr-xr-x 1 iohan users 2529 30 avril  2011 newxfce4
-rwxr-xr-x 1 iohan users 1065 12 mars   2006 titre.tcl
-rwxr-xr-x 1 iohan users 1752  8 févr.  2009 to-mp3
-rwx------ 1 iohan users  622  3 janv. 13:42 upper2low
-rwxr-xr-x 1 iohan users  726  3 janv. 10:52 user
et celle de mon programme

Code : Tout sélectionner

 create_splash.sh = create_splash.sh
 ÇyiLÈà = ÇyiLÈà
 direct = direct
 essai.tcl = essai.tcl
 éu_K = éu_K
 loop.sh = loop.sh
 mp32wav = mp32wav
 newxfce4 = newxfce4
 titre.tcl = titre.tcl
 to-mp3 = to-mp3
 upper2low = upper2low
 user = user
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [bash]Suppression des accents dans les noms de fichier

Message par tuxce »

(j'avais pas vu le typeset :|)
Sinon, le script ne fonctionne pas parce que bash (ou readline, ou le fs, je sais pas trop) voit les caractères accentués comme 2 caractères (à => a` mais un `spécial ...)

Tu peux peut être contourner avec:

Code : Tout sélectionner

#!/bin/bash

for f in *
do
  f_new=${f//[^a-zA-Z0-9_\ \.\-]/}
  echo "$f = $f_new"
done
Dernière modification par tuxce le mer. 04 janv. 2012, 11:01, modifié 1 fois.
Raison : le "-" suite à remarque benjarobin
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

Voici une solution qui fonctionne correctement, bien que je pense que ce soit une mauvaise idée d'essayer de corriger ainsi le problème; Problème que je n'ai pas compris d'ailleurs :(

Code : Tout sélectionner

#!/bin/bash
for f in *
do
  f_new=${f}
  f_new=${f_new/é/e}
  f_new=${f_new/è/e}
  f_new=${f_new/ê/e}
  #etc...
  echo "mv $f to $f_new"
  #On déplace uniquement si les 2 noms de fichier sont différents
  #TODO de-commenter
  #[ "$f_new" != "$f" ] && mv "$f" "$f_new"
done
Dernière modification par benjarobin le mar. 03 janv. 2012, 23:40, modifié 1 fois.
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1199
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [bash]Suppression des accents dans les noms de fichier

Message par karhu »

Merci, mais hélas cela ne change rien.
Ta boucle laisse les noms identiques (avec les accents).
J'ai aussi intégré ta transformation juste avant le case : même résultat. :pleure:
Je pense que je vais me tourner vers une autre solution, mais obligatoirement plus lourde et d'une esthétique douteuse, genre traiter un fichier contenant tous les noms avec sed (ou avec vim mais cela ne sera plus automatique !), puis lire les deux fichiers ligne à ligne pour faire mon mv.
J'essaye encore demain et je conclue ce poste.

Edit: tu réponds plus vite que je ne teste.
Question : pour toi aussi mon programme ne tourne pas ?
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17288
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash]Suppression des accents dans les noms de fichier

Message par benjarobin »

Ton programme ne peux pas fonctionner correctement, j'ai testé le mien et il fonctionne :D
Mais comme je l'ai indiqué précédemment tu possède surement un autre problème que tu n'as pas expliqué et dont je n'y comprend pas grand chose.
Comme je l'ai dis tu t'y prend de la mauvaise façon

Sinon je te conseil d'écrire ton programme avec nano ou au moins vérifier avec nano que tout est bon :D

Peux tu donner la sortie du mien ? Je suis curieux
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [bash]Suppression des accents dans les noms de fichier

Message par tuxce »

@benjarobin: le souci, c'est que si "é" est reconnu comme "e'" (donc 2 caractères, c'est le cas chez moi, mais je saisis pas encore pourquoi par exemple chez toi, c'est pas le cas), la substitution ne fonctionne pas. (T'utilises quoi comme locale ?)
@karhu: hmmm, là, je vois pas trop pourquoi ça fonctionne pas chez toi :?
Que donne la sortie de ce script:

Code : Tout sélectionner

#!/bin/bash

for f in *
do
  for ((i=0;i<${#f};i++)); do echo -n "${f:$i:1} "; done; echo
  f_new=${f//[^a-zA-Z0-9_-\ \.]/}
  echo "$f = $f_new"
done
Répondre