Script de suppression des caractères accentué

padz -  
 Liloulinx -
Bonjour,
je cherche (depuis 2 jours) un shell script qui permette de supprimer les caractères accentués dans mes noms de fichier. j'ai trouvé du php, du python, du perl, du javascript, mais pas shell script.
Or : je n'arrive pas à croire que ca n'ait pas été fait déjà ??!!:):)
merci à tous.
Configuration: Linux Debian
Mozilla 1.8.1.6

6 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Méthode avec "sed" :
    [lol]$ ls -1
    
    bîbïBÔö.txt
    ÇàVÀ.txt
    GÉGÉ.txt
    màmÀ.txt
    mémé.txt
    ùlûlü.txt
    
    [lol]$ for i in $(ls *.txt);do mv ${i} $(echo "$i" |sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/');done
    
    [lol]$ ls -1
    
    bibiBOo.txt
    CaVA.txt
    GEGE.txt
    mamA.txt
    meme.txt
    ululu.txt
    
    [lol]$
    Méthode avec "tr" :
    [lol]$ ls -1
    
    bîbïBÔö.txt
    ÇàVÀ.txt
    GÉGÉ.txt
    màmÀ.txt
    mémé.txt
    ùlûlü.txt
    
    [lol]$ for i in $(ls *.txt);do mv ${i} $(echo "$i" |tr 'àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ' 'aceeeeiioouuuACEEEEIIOOUUU');done
    
    [lol]$ ls -1
    
    bibiBOo.txt
    CaVA.txt
    GEGE.txt
    mamA.txt
    meme.txt
    ululu.txt
    
    [lol]$
    ;-))
    2
    1. Pierre
       
      Merci à toi !

      Le savoir est la seule ressource qui s'accroit lorsqu'on la partage
      0
    2. Liloulinx
       
      Bonjour.
      J'ai rédigé rapidement le script ci-dessous mais il ne marche pas avec des nom de fichiers qui ont des espaces. Avez-vous une idée comment l'améliorer ? Le problème est dans le
      for i in $(ls $nom_rep/)
      où le i prend chacun des mots qui forment le nom d'un fichier qui contient des espaces au lieu de prendre le nom entier. J'ai mis la commande et le nom entre double-cotes, ça s'est amélioré un peu, mais le pb persiste !


      echo "Ce script remplace les caractères accentués des noms des fichiers d'un repertoire donné par des caractères non accentués."
      read -p 'Nom du rep (incluant le chemin) : ' nom_rep
      echo "Le nom du rep donné est : $nom_rep"
      if [ ! -e $nom_rep ]; then
       echo "Rep n'existe pas"
      else
       if [ -d $nom_rep ]; then
        for i in $(ls $nom_rep/)
        do
          echo " tentative of renaming (mouving) of the file $i"
          mv  $nom_rep/${i}  $nom_rep/$(echo $i |sed 'y/ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ/aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby/')
        done
       else
        if [ -f $nom_rep ]; then
         echo "Vous avez tapé le nom d'un fichier et nom pas d'un rep"
        fi
       fi
      fi
      
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Le problème est dans le
      for i in $(ls $nom_rep/)

      Ben forcément, on ne boucle jamais sur la sortie de la commande
      ls
      ;-(

      for i in $nom_rep/*
      0
    4. Liloulinx
       
      Bonjour.
      Oui, je n'ai pas bien vu. J'ai mis 2 fois le $. C'était lors des tests.
      Sinon, je l'ai changé en comme ceci:
      #!/bin/bash
      
      echo "Ce script remplace les caractères accentués des noms des fichiers d'un repertoire donné par des caractères non accentués."
      read -p 'Nom du rep (incluant le chemin) : ' nom_rep
      echo "Le nom du rep donné est : $nom_rep"
      if [ ! -e $nom_rep ]; then
       echo "Rep n'existe pas"
      else
       if [ -d $nom_rep ]; then
        for i in $nom_rep/*
        do
          echo " Tentative de renomer le fichier $i"
          nouveau_nom='echo "$i"|sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/''
          echo "nouveau_nom= " $nouveau_nom
          mv  "${i}"  "$nouveau_nom"
        done
       else
        if [ -f $nom_rep ]; then
         echo "Vous avez tapé le nom d'un fichier et nom pas d'un rep"
        fi
       fi
      fi
      


      Cette fois-ci ça marche car dans la ligne correspondant à la commande mv, j'ai mis mes variables de fichier source et fichier destination entre double-quottes.

      root@vp:/# ls /rep_test/
      mémé tété.bébé  sébastien.fr  Sécuriser où il faut.txt
      root@vp:/# /root/script_changer_noms_fichiers_rep.sh
      Ce script remplace les caractères accentués des noms des fichiers d\'un repertoire donné par des caractères non accentués.
      Nom du rep (incluant le chemin) : /rep_test
      Le nom du rep donné est : /rep_test
       Tentative de renomer le fichier /rep_test/mémé tété.bébé
       Tentative de renomer le fichier /rep_test/sébastien.fr
       Tentative de renomer le fichier /rep_test/Sécuriser où il faut.txt
      root@vp:/# ls /rep_test/
      meme tete.bebe  sebastien.fr  Securiser ou il faut.txt
      


      Merci pour votre aide.
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tu peux faire ça soit avec la commande "tr" soit avec "sed" :
    tr 'àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ' 'aceeeeiioouuuACEEEEIIOOUUU'
    sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/'
    Libre à toi d'adapter l'une ou l'autre dans ton script...

    ;-))
    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    il y a les commandes dos2unix et unix2dos
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut dubcek,

      Euh... t'es sûr que ces 2 commandes convertissent les caractères accentués ?

      ;-))
      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    The dos2unix utility converts characters in the DOS extended character set to the corresponding ISO standard characters

    je ne peux pas tester, mais je crois me souivenir que oui, bien que la queston du sujet soit "supprimmer" et pas convertir
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. padz
     
    Merci pour ces réponses ;)
    pour les commandes "tr" et "sed", jai essayé mais ca n'a pas l'air de marcher (je perds l'invite, ca clignote puis rien)
    (J'ai essayé à la fois en passant directement la commande dans une fenêtre terminal et dans un script).

    Aurais-je loupé un étage ?
    0
  7. Liloulinx
     
    Bonjour,
    J'ai rédigé rapidement le script ci-dessous mais il ne marche pas avec des nom de fichiers qui ont des espaces. Avez-vous une idée comment l'améliorer ? Le problème est dans le
    for i in $(ls $nom_rep/)
    où le i prend chacun des mots qui forment le nom d'un fichier qui contient des espaces au lieu de prendre le nom entier. J'ai mis la commande et le nom entre double-cotes, ça s'est amélioré un peu, mais le pb persiste !

    echo "Ce script remplace les caractères accentués des noms des fichiers d'un repertoire donné par des caractères non accentués."
    read -p 'Nom du rep (incluant le chemin) : ' nom_rep
    echo "Le nom du rep donné est : $nom_rep"
    if [ ! -e $nom_rep ]; then
     echo "Rep n'existe pas"
    else
     if [ -d $nom_rep ]; then
      for i in $(ls $nom_rep/)
      do
        echo " tentative of renaming (mouving) of the file $i"
        mv  $nom_rep/${i}  $nom_rep/$(echo $i |sed 'y/ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ/aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby/')
      done
     else
      if [ -f $nom_rep ]; then
       echo "Vous avez tapé le nom d'un fichier et nom pas d'un rep"
      fi
     fi
    fi
    
    0