Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/10/2007, à 19:21

marcoplaut

renommage en série pour supprimer des accents

Bonsoir,

J'ai actuellement des problèmes pour effectuer des sauvgardes à cause de fichiers ayant des noms accentués. Savez vous comment je peux m'y prendre pour enlever tous les accents des nom de fichiers et dossier de maniere récursive dans un repertoire donné ?

Merci

Hors ligne

#2 Le 23/10/2007, à 19:24

DiCiCat

Re : renommage en série pour supprimer des accents

thunar dans xfce le fait, sinon il y à krename aussi (mais c'est un logiciel utilisant les librairies graphiques de kde sad ).
En gtk/gnome, je n'ai rien trouvé pour le faire

Hors ligne

#3 Le 23/10/2007, à 19:32

FestinMWM

Re : renommage en série pour supprimer des accents

Avec Metamorphose (<--protocole apt wink,
sous l'onglet "l'essentiel", tu coches "chercher .." espression "é" (sans les guillemets) par exemple
remplacér par "e"(sans les guillemets) par exemple.

Avec ce topic, c'est la première fois que j'essaie ce logiciel, il est assez simple à prendre en main.

Il y a aussi la possibilité d'expressions régulières

Dernière modification par FestinMWM (Le 23/10/2007, à 19:34)


Dapper-->Edgy-->Feisty-->Gutsy-->Hardy-->Ibby-->Jaunty-->Karmic> Mint LXDE sur PC de 2001 AMD 800 MHz, 1024Mo RAM, 9 Go linux, geforce old 4200
La liberté, c'est ce que permet la longueur de la laisse.

Hors ligne

#4 Le 23/10/2007, à 19:34

Hoper

Re : renommage en série pour supprimer des accents

Si tu veux je te propose un petit script pour résoudre le problème...
Ca devrait changer tous les noms de en remplaçant toutes les majuscules par des minuscules et tous les caractères accentués par des lettres sans accents, ca supprimera aussi tous les caracteres trop bizarroïdes...

Je te laisse adapter au besoin smile

#!/bin/bash

IFS="|"
if [ $# -lt 1 ]
then
        echo "Usage: `basename $0` <file(s)>"
fi
for file in $@
do
   file_mod=`echo "$file" | \
      tr '[A-Z]' '[a-z]' | \
      tr '[àâäéèêëîïôöùûü]' '[aaaeeeeiioouuu]' | \
      sed -e "s/[[:space:]]/_/g" | \
      sed -e "s/-//g" | \
      sed -e "s/\/$//" | \
      sed -e "s/'/_/g" | \
      sed -e "s/__/_/g"`
   mv "$file" "$file_mod"
done

Dernière modification par Hoper (Le 23/10/2007, à 19:36)


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#5 Le 23/10/2007, à 19:36

Link31

Re : renommage en série pour supprimer des accents

Commence par tester ça :

for i in $(find .); do echo "mv $i $(echo $i | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU")"; done

Si ça semble être correct (pas de problèmes d'encodage), alors c'est bon, tu peux enlever le echo :

for i in $(find .); do mv "$i" $(echo $i | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"); done

Hors ligne

#6 Le 23/10/2007, à 20:41

capucino

Re : renommage en série pour supprimer des accents

GPRename

marche très bien

Hors ligne

#7 Le 23/10/2007, à 21:44

marcoplaut

Re : renommage en série pour supprimer des accents

Je n'ai pas d'acces graphique au serveur, tout doit se faire en ligne de commande.
Je rencontre un soucis avec la méthode de Link voici ce que me renvoi la commande d'évaluation :

mv ./._valeurabs.pict ./._valeurabs.pict
mv ./éaoupé ./UeaoupUe

surement un problème d'encodage. Avez vous une idée pour resoudre ca ?

Hors ligne

#8 Le 24/10/2007, à 01:21

Link31

Re : renommage en série pour supprimer des accents

Je vois que j'ai bien fait de te proposer de tester la première commande. J'avais un doute : il se trouve que j'ai le même problème. En fait c'est un bug de tr avec l'utf8.

Il va falloir y aller à coup de sed :

export TEMP=`mktemp`
find . > $TEMP
while read i; do mv "$i" "$(echo $i | sed 's/à/a/'|sed 's/ç/c/'|sed 's/é/e/'|sed 's/è/e/'|sed 's/ê/e/'|sed 's/ë/e/'|sed 's/î/i/'|sed 's/ï/i/'|sed 's/ô/o/'|sed 's/ö/o/'|sed 's/ù/u/'|sed 's/ü/u/'|sed 's/Â/A/'|sed 's/Ç/C/'|sed 's/É/E/'|sed 's/È/E/'|sed 's/Ê/E/'|sed 's/Ë/E/'|sed 's/Î/I/'|sed 's/Ï/I/'|sed 's/Ô/O/'|sed 's/Ö/O/'|sed 's/Ù/U/'|sed 's/Ü/U/')"; done < $TEMP
rm $TEMP

(peut-être qu'un gourou des expressions régulières trouvera le moyen de réduire ça à une seule substitution...)

Dernière modification par Link31 (Le 24/10/2007, à 01:24)

Hors ligne

#9 Le 25/10/2007, à 17:50

marcoplaut

Re : renommage en série pour supprimer des accents

je me fais jeter lors de l'execution :

marco@ubuntu:~/accentué$ ./accents.sh
./accents.sh: line 2: erreur de syntaxe près du jeton `do' inattendu
while read i; do mv "$i" "$(echo $i | sed 's/à/a/'|sed 's/ç/c/'|sed 's/é/e/'|sed 's/è/e/'|sed 's/ê/e/'|sed 's/ë/e/'|sed 's/î/i/'|sed 's/ï/i/'|sed 's/ô/o/'|sed 's/ö/o/'|sed 's/ù/u/'|sed 's/ü/u/'|sed 's/Â/A/'|sed 's/Ç/C/'|sed 's/É/E/'|sed 's/È/E/'|sed 's/Ê/E/'|sed 's/Ë/E/'|sed 's/Î/I/'|sed 's/Ï/I/'|sed 's/Ô/O/'|sed rm $TEMP'sed 's/Ù/U/'|sed 's/Ü/U/')"; done < $TEMP

Dernière modification par marcoplaut (Le 25/10/2007, à 17:51)

Hors ligne

#10 Le 27/10/2007, à 19:23

Alain.g

Re : renommage en série pour supprimer des accents

Bonsoir
Très pratique pour cela : unaccent (le paquet du même nom est dispo dans les dépôts).

exemple :
unaccent UTF-8 àçéï
ou
echo àçéï | unaccent UTF-8

sinon pour l'utilisation de sed, il faudrait le faire de cette façon 'y//' :

echo àçéï | sed 'y/àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ/aaceeeeiioouuAACEEEEIIOOUU/'

Dernière modification par Alain.g (Le 27/10/2007, à 19:35)


Xubuntu Karmic !

Hors ligne

#11 Le 27/10/2007, à 19:56

Link31

Re : renommage en série pour supprimer des accents

marcoplaut a écrit :

je me fais jeter lors de l'execution :

./accents.sh: line 2: erreur de syntaxe près du jeton `do' inattendu

Il faut utiliser bash et non dash (sh) dans ton script (#!/bin/bash).

Avec la solution de Alain.g, ça donne donc :

#!/bin/bash
export TEMP=`mktemp`
find . > $TEMP
while read i; do mv "$i" "$(echo $i | sed 'y/àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ/aaceeeeiioouuAACEEEEIIOOUU/')"; done < $TEMP
rm $TEMP

Dernière modification par Link31 (Le 27/10/2007, à 19:57)

Hors ligne

#12 Le 20/02/2008, à 13:16

skysk8er

Re : renommage en série pour supprimer des accents

Metamorphose : extraordinaire ! une vraie merveille de puissance et de simplicité

Dernière modification par jean-pierre cambray (Le 20/02/2008, à 13:17)


Passé à  Ubuntu en octobre 2006
ubuntu 20.04 LTS sur PC Dell Optiplex 760 avec core 2 duo, 8 Go de RAM et 1 SSD de 1 To ; 20.04 LTS sur portable Asus Vivobook S14 ; Imac 27" Intel Core i5 Quad core.

Hors ligne

#13 Le 02/04/2009, à 21:12

selenium

Re : renommage en série pour supprimer des accents

Ayant aussi un problème d'accent sous mandriva 2009 avec KDE4, j'ai été dépanné grace aux post précédents.
Je vous poste donc ma version du script "amélioré" pour permettre de traiter une arborescence importante.
On s'occupe d'abord des noms de dossiers, puis ça renomme les fichiers.
C'est mon premier gros script, donc je m'en suis servi pour apprendre ce langage.
Au final j'ai renommé 1500 accents encodés en iso et 2500 encodés en utf8 ! cool

Merci de lire les deux remarques en début de script avant de vous lancer.

#!/bin/bash
# Script permettant de renommer des fichiers et dossiers en remplacant une liste de caractères
# Sélénium134 | débuté le 11/01/2009 | dernière modif le 24/03/2009


#### DEUX REMARQUES IMPORTANTES ####

# Attention, pour virer les mauvais caractères, ce script doit pouvoir les lires !
# Pas d'autre solutions trouvées à l'heure actuelle.
# Donc il faut paramètrer les "locales" pour lire le format iso
# Dans Mandriva il faut aller dans le centre de controle > Système > Gérer les paramètre locaux de votre système > Avancé > Compatibilité encodage ancien (non UTF8)

# Attention, pour fonctionner correctement, ce script doit être encodé de la même façon que les caractères cibles !
# Il est normalement distribué en UTF8, qui est l'encodage des distributions linux récentes.
# Cependant, le but de ce fichier est de supprimer les caractères accentués dans les anciens encodages.
# Il faut donc le convertir dans l'encodage recherché avec la commande suivante :
# $ iconv -f utf-8 -t iso-8859-1 <accent_utf8.sh >accent_iso8859.sh
# Ne pas oublier après de le rendre exécutable !
# Pour le remettre en UTF8 (ben oui pour virer les accents même ceux qui sont bien encodés) :
# $ iconv -f iso-8859-1 -t utf-8 <accent_iso8859.sh >accent_utf8.sh
# Pour connaitre l'encodage d'un fichier avec caractètre accentué (ou de celui ci avant exécution) :
# $ file -i FICHIER.TXT

#### DECLARATION VARIABLES ####

# Répertoire à parcourir
#REP=/mnt/prod/home/thomas/accent/test/
# Liste des caractères à remplacer
ACC=àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ
# Liste des caractères remplaçants
RMP=aaceeeeiioouuAACEEEEIIOOUU
# Initialisation d'un compteur
COMPT=0
# Initialisation d'une variable
END=1
# Création de la variable TEMP qui prend la valeur d'une commande (` `) permettant de créer un fichier temporaire « unique » dans le répertoire /tmp (mktemp)
TEMP=`mktemp`

#### CREATION FONCTIONS ####

# Création d'une fonction (Confirmation) qui demande une confirmation au clavier
Confirmation () {
  echo
  echo "Etes vous d'accord pour continuer (o/n) ?"
  # Attend la saisie d'un paramètre (read) qui sera enregistré dans une variable (nommée CONF)
  read CONF
  # Teste si la réponse est différente de o et abandonne l'exécution dans ce cas
  if [ "$CONF" != "o" ]
  then
    echo "Exécution abandonné."
    exit 0
  fi
}

# Création d'une fonction (Remplacer) dont le paramètre est le type d'élément à traiter : d pour dossier et f pour fichier
Remplacer () {
    
  # Cherche (find) dans le répertoire à parcourir ($REP) tous les fichiers ou dossier (-type $1)
  # dont le nom (-name) contient un des caractères à remplacer (*[$ACC]*) et les écrit (>) dans un fichier ($TEMP)
  find $REP -type $1 -name "*[$ACC]*" > $TEMP
  
  # Test qui fait que si Temp est vide on zappe la confirmation et on passe un paramètre (END=0) à la fonction plus bas pour arréter de boucler sur les dossiers
  if [ -n "$(cat $TEMP)" ]
  then
    
    # Renvoi la liste et demande confirmation de l'exécution du remplacement
    echo "Liste des éléments à traiter :"
    cat $TEMP
    # Demande de confirmation (appel de la fonction Confirmation)
    Confirmation
    
    # Prend le fichier donné en argument (< $TEMP) et lit (read) toutes les lignes (i) tant qu'il y en a (while)
    # Pour chaque ligne fait l'action (do) de renommer (mv) en mode interactif et verbeux (-iv) et renomme (et non déplace) les dossiers (T)
    # Le fichier de départ ("$i") est renommé en remplaçant (sed) les caractères contenus dans la liste (ACC) par ceux de la seconde liste (RMP)
    while read i ; do
      #cp -ivR "$i" "$i"_acc134\/" # sauvegarde des fichiers ??
      mv -ivT "$i" "$(echo $i | sed 'y/'$ACC'/'$RMP'/')"
      let "COMPT = $COMPT + 1"
    done < $TEMP
    
    # Avant du supprimer Temp, faire un fichier de log qui conserve en mémoire les changements effectués et leur date
    
    # Supprime (rm) le fichier temporaire créé (TEMP)
    rm $TEMP
    
  else
    END=0
  fi
}

#### MESSAGES DE DEBUT DU SCRIPT ####

# Message d'explication et rappel des paramètres
echo
echo "Cette commande permet de renommer des fichiers et dossiers en remplacant une liste de caractères."

# Demande de saisir au clavier le répertoire à traiter
echo "Indiquer le chemin absolu du répertoire à traiter :"
read REP

echo "Répertoire traité : $REP et tous ses sous-répertoires."
echo "Caractères à remplacer : $ACC"
echo "Caractères remplacants : $RMP"
echo "Attention, le chemin du répertoire traité ne doit pas contenir un des caractères à remplacer sinon ils vont l'être aussi."

# Demande de confirmation (appel de la fonction Confirmation)
Confirmation

# Plus tard, ajouter la possibilité de modifier manuellement les paramètres (au moins le répertoire)
# Teste si un des caractères du répertoire traité fait partie de la liste à remplacer
#if [ "$REP" == "*["$ACC"]*" ]
#then
#  echo "Un des caractères du répertoire traité fait partie de la liste à remplacer."
#  echo "Il n'est pas possible de traiter ce cas sans générer d'erreur."
#  echo "Exécution abandonné."
#  exit 1
#fi

#### EXECUTION DES REMPLACEMENTS ####

# Traitement des dossiers dans un premier temps
# Tant que (while) il reste des dossiers contenant des caractères recherchés (varible END non vide)
while  [ "$END" -eq 1 ] ; do
  echo
  echo "** Traitement des dossiers **"
  # Appel de la fonction pour traitement des dossiers (d)
  Remplacer d
done

# Une fois les dossiers traités, vient le tour des fichiers (moins de problème dans ce cas seul leur noms change et pas leur dossier parent)
echo
echo "** Traitement des fichiers **"
# Appel de la fonction pour traitement des fichiers (f)
Remplacer f

# Message de fin indiquant le nombre de remplacements
echo "$COMPT remplacement(s) effectué(é)."

# Sortie du script
exit 0

#14 Le 06/11/2014, à 01:43

nandayo

Re : renommage en série pour supprimer des accents

capucino a écrit :

GPRename

marche très bien

Je confirme, ce soft est épatant et très intuitif, de loin la meilleure solution. Merci !


Plus de feedback dans le brainstorm et plus facilement ? --> http://brainstorm.ubuntu.com/idea/18056/

Hors ligne