Page 2 sur 3
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mar. 03 janv. 2012, 23:55
par karhu
Le programme
Code : Tout sélectionner
#!/bin/bash
for f in * # les fichiers du répertoire
do
f_new=${f};
f_new=${f_new/é/e}
f_new=${f_new/É/E}
f_new=${f_new/ê/e}
f_new=${f_new/à/a}
f_new=${f_new/Ç/c}
echo -e " $f = $f_new"; # pour tester avant le "mv"
done
echo -e "";
Le résultat :
Code : Tout sélectionner
add_pref = add_pref
bootest = bootest
chemin = chemin
chg_2_mp3.sh = chg_2_mp3.sh
couleurs.sh = couleurs.sh
create_splash.sh = create_splash.sh
ÇyiLÈà = ÇyiLÈà
dir-bis = dir-bis
dir-bis~ = dir-bis~
direct = direct
direct~ = direct~
dir.txt = dir.txt
ê-gœ = ê-gœ
essai.tcl = essai.tcl
éu_K = éu_K
éu_K~ = éu_K~
loop.sh = loop.sh
montage = montage
mp32wav = mp32wav
newxfce4 = newxfce4
pac-drive.sh = pac-drive.sh
para-awk = para-awk
parametre = parametre
profile = profile
prog.sh = prog.sh
renom = renom
renom_file = renom_file
titre.tcl = titre.tcl
to-mp3 = to-mp3
upper2low = upper2low
user = user
Cela ne fonctionne toujours pas.Je n'ai mis que les lettres que j'était sûr de trouver.
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 00:02
par karhu
Avec
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
echo -e "";
Juste le résultat des fichiers en question
Code : Tout sélectionner
Ç y i L È à
ÇyiLÈà = ÇyiLÈà
ê - g œ
ê-gœ = êgœ
e s s a i . t c l
essai.tcl = essai.tcl
é u _ K
éu_K = éuK
é u _ K ~
éu_K~ = éuK
Par contre pour les caractères spéciaux, seulement, j'ai bien deux octets dont le premier a pour valeur "C3".
Peut-être une piste
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 00:04
par tuxce
Bon, on en apprend tous les jours, moi, ça me donne:
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 00:09
par karhu
Demain je vais tester sur ma vieille Ubuntu, pour voir.
J'essaierai sur mon portable qui est lui aussi sous Archlinux, qui sait ?
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 10:02
par FoolEcho
karhu a écrit :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 ?
Effectivement le tr ne va pas, je ne connais pas trop sa syntaxe (ça m'étonne un peu, mais en parcourant vite fait le web, certaines versions ne supporteraient pas l'utf8)...
Par contre, le sed devrait fonctionner avec autant de caractères de part et d'autre (il te manque deux caractères à gauche).
sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/
Code : Tout sélectionner
$ echo "C'est déjà ça"|sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'
C'est deja ca
... parce que ça me fait mal de te voir t'échiner sur des itérations caractère par caractère en bash (au passage, je ne connaissais pas le typeset, mais tu as cette syntaxe aussi:
j=0;echo $((j+=10))
).

Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 10:04
par benjarobin
tuxce a écrit :@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 ?)
Hum c'est de l'utf8 donc
é
dont le code unicode est 0x00E9 est normalement composé de 0xC3 0xA9 soit "é"
@tuxce Sinon ta regexp est fausse car - doit toujours être à la fin sinon il considère ceci comme un "range"
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 10:35
par karhu
foolecho a écrit :
(il te manque deux caractères à gauche)
Oui dans mon poste, mais pas dans tous les tests. Tentative de faire réagir
sed qui m'annonçait une erreur sur une colonne, en supprimant une lettre je voulais voir si l'erreur suivait.
Je viens de refaire les tests sur le même PC avec une autre distribution (Ubuntu hardy) et sur un autre PC avec Archlinux : les résultats sont identiques !
foolecho a écrit :
echo "C'est déjà ça"|sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'
fonctionne aussi chez moi en ligne de commande (je viens de le vérifier) mais pas lorsqu'il est intégré au script. D'où cette superbe itération qui donne du charme et du sérieux.
Je vais continuer à chercher dans ce sens (
sed), quitte à créer une fonction applicable fichier par fichier et non par répertoire.
benjarobin a écrit :
Hum c'est de l'utf8 donc é dont le code unicode est 0x00E9 est normalement composé de 0xC3 0xA9 soit "é"
exact.
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 10:38
par benjarobin
Tu utilise bien bash et non autre chose pour ton script ?
Comment lance tu ton script ? Je maintient que tu as définitivement des problèmes de configuration
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 10:58
par karhu
Oui et non pour la configuration, le même problème sur deux PC et sur deux distributions, ou alors cela viendrait de ma "
procédure d'installation".
En ligne de commande c'est bon
Code : Tout sélectionner
echo "C'est déjà ça"|sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'
C'est deja ca
ma version bash :
Code : Tout sélectionner
bash -version
GNU bash, version 4.2.20(2)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
J'envoie mon script dans le répertoire à vérifier par la commande : ./<script>
Dans un script ce n'est pas bon
Code : Tout sélectionner
#!/bin/bash
echo -e "";
for f in * # les fichiers du répertoire
do
nom=`echo ${f} | sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'`;
echo -e " $f = $nom"; # pour tester avant le "mv"
nom=`exec echo ${f} | sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'`;
echo -e " $f = $nom"; # pour tester avant le "mv"
done
echo -e "";
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 11:04
par benjarobin
A mais ce n'est absolument pas le même code, si tu met juste
Code : Tout sélectionner
#!/bin/bash
echo "C'est déjà ça"|sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'
Moi je dis que l'on s’embête un peu trop avec bash, un bon programme en C et on comprendra au moins ce qui se passe
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 11:22
par FoolEcho
Fonctionne chez moi avec:
Code : Tout sélectionner
#!/bin/bash
echo -e "";
#for f in ~/Musique/Georges\ Brassens/Les\ copains\ d\'abord\ \(CD\ 1\)/* # les fichiers du répertoire
for f in *
do
nom=`echo ${f} | sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'`;
echo -e " $f = $nom"; # pour tester avant le "mv"
done
echo -e "";
Code : Tout sélectionner
$ ./change.sh
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/01 - Le gorille.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/01 - Le gorille.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/02 - Les amoureux des bancs publics.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/02 - Les amoureux des bancs publics.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/03 - Les sabots d'Hélène.flac = /home/dummy/Georges Brassens/Les copains d'abord (CD 1)/03 - Les sabots d'Helene.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/04 - Chanson pour l'Auvergnat.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/04 - Chanson pour l'Auvergnat.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/05 - La chasse aux papillons.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/05 - La chasse aux papillons.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/06 - Auprès de mon arbre.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/06 - Aupres de mon arbre.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/07 - Le pornographe.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/07 - Le pornographe.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/08 - Dans l'eau de la claire fontaine.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/08 - Dans l'eau de la claire fontaine.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/09 - Les trompettes de la renommée.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/09 - Les trompettes de la renommee.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/10 - Les deux oncles.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/10 - Les deux oncles.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/11 - Les copains d'abord.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/11 - Les copains d'abord.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/12 - Supplique pour être enterré à la plage de Sète.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/12 - Supplique pour etre enterre a la plage de Sete.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/13 - La non-demande en mariage.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/13 - La non-demande en mariage.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/14 - Rien à jeter.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/14 - Rien a jeter.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/15 - Heureux qui comme Ulysse.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/15 - Heureux qui comme Ulysse.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/16 - Mourir pour des idées.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/16 - Mourir pour des idees.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/17 - Tempête dans un bénitier.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/17 - Tempete dans un benitier.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/18 - Cupidon s'en fout.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/18 - Cupidon s'en fout.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/19 - Élégie à un rat de cave.flac = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/19 - Elegie a un rat de cave.flac
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/change.sh = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/change.sh
/home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/Lescopainsd'abord.png = /home/dummy/Musique/Georges Brassens/Les copains d'abord (CD 1)/Lescopainsd'abord.png
Après, on peut faire le script à coup de find/exec pour renommer à la volée...
Mais je rejoins benjarobin, tout ça n'est que du contournement: personne n'a compris quel était vraiment ton problème, c'est-à-dire comment tu arrives à des fichiers dont l'encodage est différent. C'est ça qu'il faut règler.

Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 11:30
par karhu
Alors voilà le problème :
Code : Tout sélectionner
#!/bin/bash
echo -e "";
for f in * # les fichiers du répertoire
do
nom=`echo ${f} | sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'`;
echo -e " $f = $nom"; # pour tester avant le "mv"
done
echo -e "";
echo "C'est déjà ça"|sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/';
echo -e "";
Résultat (significatif)
Code : Tout sélectionner
ÇyiLÈà = ÇyiLÈà
direct = direct
ê-gœ = ê-gœ
essai.tcl = essai.tcl
éu_K = éu_K
C'est deja ca
Il semble bien que ce soit
bash qui ait du mal en interne avec UTF8 !
Pour le petit programme en "C", pourquoi pas, mais il n'est pas très doué pour le maniement des chaînes de caractères, il va falloir écrire quelques fonctions spécifiques, quoi ré-inventer !
Quitte à être lourd, pourquoi pas utiliser du PHP ?

Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 11:33
par farvardin
c'est bien de savoir comment faire ça en bash, mais il y a également le programme detox qui est adapté pour résoudre ce genre de problème :
http://detox.sourceforge.net/
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 11:48
par benjarobin
Code : Tout sélectionner
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main (void)
{
DIR *dp;
struct dirent *ep;
char *ptName;
dp = opendir ("./");
if (dp != NULL)
{
while ((ep = readdir (dp)))
{
printf("===> %s\n", ep->d_name);
for(ptName = ep->d_name; *ptName != 0; ptName++)
{
printf("0x%X '%c'\n", (char)*ptName, *ptName);
}
}
closedir (dp);
}
else {
perror ("Couldn't open the directory");
}
return 0;
}
Enregistre ce fichier par exemple sous listeFile.c, puis compile le, place le dans le dossier à lister et exécute le :
Code : Tout sélectionner
gcc listeFile.c -o listeFile
cp listeFile /le/dossier/a/lister/contenant/des/accents/
/le/dossier/a/lister/contenant/des/accents/listeFile
Si on ne comprend pas ce qui se passe avec ceci, j'abandonne

Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 12:10
par FoolEcho
J'insiste aussi...
karhu a écrit :Résultat (significatif)
Code : Tout sélectionner
ÇyiLÈà = ÇyiLÈà
direct = direct
ê-gœ = ê-gœ
essai.tcl = essai.tcl
éu_K = éu_K
C'est deja ca
Il semble bien que ce soit bash qui ait du mal en interne avec UTF8 !
C'est ton bash ou l'encodage de ta console qui a un problème, même script que toi:
Code : Tout sélectionner
$ touch ÇyiLÈà direct ê-gœ essai.tcl éu_K
$ ./change.sh
change.sh = change.sh
change.sh~ = change.sh~
ÇyiLÈà = CyiLEa
direct = direct
ê-gœ = e-gœ
essai.tcl = essai.tcl
éu_K = eu_K
(je suis en utf8 et konsole aussi, ça va de soi)
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 12:12
par karhu
J'ai de plus en plus de mal à comprendre !
Dans mon .bashrc j'ai créé une fonction de changement
Code : Tout sélectionner
change () {
cp $1 `echo $1 | sed 'y/[àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ]/[aaceeeeiioouuAACEEEEIIOOUU]/'`;
}
après un source .bashrc
Code : Tout sélectionner
change éu_K
ls -A
-rw-r--r-- 1 iohan users 0 3 janv. 15:37 ÇyiLÈà
-rwxr--r-- 1 iohan users 1091 4 janv. 11:51 direct
-rw-r--r-- 1 iohan users 305 3 janv. 23:51 dir.txt
-rw-r--r-- 1 iohan users 277 4 janv. 11:43 ê-gœ
-rwxr-xr-x 1 iohan users 196 7 mars 2006 essai.tcl
-rw-r--r-- 1 iohan users 277 4 janv. 12:06 eu_K
-rw-r--r-- 1 iohan users 277 4 janv. 11:43 éu_K
Edit: tester avec terminal encodage UTF-8 (?)
avec xterm encodage UTF-8
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 12:34
par mimas
> J'ai de plus en plus de mal à comprendre !
Revenons sur ton assertion
> 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.
Il est facile de démontrer qu'elle est fausse, quelques millions de russes, arabophones, japonais… pourront facilement aller dans mon sens. Donc si ce n'est pas l'informatique qui ne pose pas le problème, alors qu'est-ce ?
Pour résoudre ce problème d'encodage, tu vas utiliser bash et un jeu de programmes primitifs, qualité qui ne les rends pas pour autant inutiles ou impuissants. Puis là tu te rends compte qu'en fait tu comprends de moins en moins le problème.
Je suis tenté de répondre : « S'il n'y a pas de solution, c'est qu'il n'y a pas de problème. ». Mais je vais répondre que si tu rencontres un problème en utilisant des outils, et que tu n'arrives pas à le résoudre avec ces outils, alors c'est peut-être que les outils ne sont pas les bons.
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 13:31
par karhu
Absolument d'accord.
Ma difficulé à comprendre le problème vient du fait que si j'utilise la commande en ligne ou sous forme de fonction définie dans mon .bashrc elle fonctionne. Seulement si je l'utilise à l'interieur d'un script elle ne fonctionne plus.
Il me semble que pourtant dans les trois cas c'est au final l'interpréteur "bash" qui fait le travail.
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 13:36
par benjarobin
J'ai ma théorie et j'avais posé une question dans ce sens mais tu n'as pas répondu.
Je parie que l'encodage du script et du bashrc n'est pas le même. Et je mise que c'est gedit le problème.
Donc comme spécifié précédemment as tu tenté d'écrire le script avec nano ?
Re: [bash]Suppression des accents dans les noms de fichier
Publié : mer. 04 janv. 2012, 18:40
par karhu
Merci @Benjarobin.
Le problème venait bien de
gedit je pense.
Le script suivant, écrit avec
vim, fonctionne.
Code : Tout sélectionner
#!/bin/bash
echo -e "";
for f in *
do
nom=`echo ${f} | sed 'y/àâéèêëîïôöùûüçÀÂÉÈÊËÎÏÔÖÙÛÜÇ/aaeeeeiioouuucAAEEEEIIOOUUUC/'`;
echo -e " $f = $nom";
done
echo -e "";
Du coup je vais virer gedit et le remplacer par l'interface graphique de
vim, en espérant que cela continue à fonctionner.
C'est quand même marrant de toujours vouloir chercher le plus compliqué !
@mimas tu avais raison, j'utilisais un mauvais outil. Je vérifierai mieux la prochaine (résolution de début d'anné).
