Script de suppression des caractères accentué

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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]$
    ;-))
    1. Merci à toi !

      Le savoir est la seule ressource qui s'accroit lorsqu'on la partage
    2. 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
      
    3. Contributeur
      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/*
    4. 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.
  2. Modérateur
    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...

    ;-))
    1. Contributeur
      hello
      il y a les commandes dos2unix et unix2dos
      1. Modérateur
        Salut dubcek,

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

        ;-))
    2. Contributeur
      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
      1. 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 ?
        1. 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