#1 Le 20/04/2007, à 12:46
- linuxnico
script bash transforme les mots et pas la phrase entiere :-(
bonjour,
j'ai fait un script shell pour modifier mes accents dans le nom de mes fichier:
#!/bin/bash
for i in $(find ./ *); do
R="`echo "$i" | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"`" ;
echo "$i------$R\n";
if [ "$R" != "$i" ]
then
mv "$i" "$R"
fi
done
Mais voila, ca marche mais pas completement.
je m'explique, lorsque le fichier s'appelle "xxxxx.xx" c'est bon il transforme les accents mais si il y a des espace dans le com, comme "xxxx yyyy zzzz.ttt" il essaye me transformer chaque mot et donc de me renommer le fichier correspondants au mot (qui n'existe pas...)
mais je ne trouve pas comment faire pour qu'il me transforme tout le texte et pas juste un mot dans le texte.
j'ai sait qu'il existe sed, mais je ne connais pas du tout la syntaxe, et si ca marcherai mieux.
Merci de votre aide
S'il n'y a pas de solution
c'est qu'il n'y a pas de probleme
SCHADOCK
Hors ligne
#2 Le 20/04/2007, à 14:23
- qqun
Re : script bash transforme les mots et pas la phrase entiere :-(
Avec sed il suffit d'utiliser :
sed -e s/ç/c/g
pour remplacer par exemple le ç par c.
sinon pour remplacer les accents des noms de fichier d'un repertoire ,une solution
peut etre de lister les noms des fichiers du repertoire dans un fichier temp et apres
les traiter .
dans cet exemple je change juste les ç,é,è,à,ô par c,e,e,a,o
il suffit de rajouter les autres a la ligne sed pour avoir qqchose de complet.
#!/bin/bash
ls > fic.tmp
cat < fic.tmp | while true
do
read ligne
if [ "$ligne" = "" ]; then break; fi
R=`echo $ligne | sed -e s/ç/c/g -e s/é/e/g -e s/è/e/g -e s/à/a/g -e s/ô/o/g `
echo $ligne "--->" $R
if [ "$R" != "$ligne" ]
then
mv "$ligne" "$R"
fi
done
ls -1
caleçon.fic
écharpe.tst
hôte.ked
le système.nop
mon hôte.ked
système.nop
tmp
tt.sh
un caleçon.fic
une écharpe.tst
./tt.sh
caleçon.fic ---> calecon.fic
écharpe.tst ---> echarpe.tst
fic.tmp ---> fic.tmp
hôte.ked ---> hote.ked
le système.nop ---> le systeme.nop
mon hôte.ked ---> mon hote.ked
système.nop ---> systeme.nop
tmp ---> tmp
tt.sh ---> tt.sh
un caleçon.fic ---> un calecon.fic
une écharpe.tst ---> une echarpe.tst
0
ls -1
calecon.fic
echarpe.tst
fic.tmp
hote.ked
le systeme.nop
mon hote.ked
systeme.nop
tmp
tt.sh
un calecon.fic
une echarpe.tst
#3 Le 01/05/2007, à 19:37
- linuxnico
Re : script bash transforme les mots et pas la phrase entiere :-(
bon ca marche merci, mais j'ai encore un pb, c'est que j'ai des sous repertoire et la un ls et un ls -R ne donne pas du tout la meme sortie... :-(
a tu une solution pour ce nouveau probleme?
merci
S'il n'y a pas de solution
c'est qu'il n'y a pas de probleme
SCHADOCK
Hors ligne
#4 Le 02/05/2007, à 10:42
- qqun
Re : script bash transforme les mots et pas la phrase entiere :-(
et si tu remplaces simplement
ls > fic.tmp
PAR
find ./ > fic.tmp
cela ne marche pas avec les sous repertoires ?
#5 Le 02/05/2007, à 11:46
- linuxnico
Re : script bash transforme les mots et pas la phrase entiere :-(
alors voila ce que j'ai mis dans mon script:
#!/bin/bash
find ./ > liste.txt
#for i in $(cat liste.txt);
cat < liste.txt | while true
do
read ligne
if [ "$ligne" = "" ]; then break; fi
R="`echo "$ligne" | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"`" ;
echo "$ligne"------"$R"\n;
if [ "$R" != "$ligne" ]; then
echo mv "$i" "$R"
fi
et voila le resultat:
nico@nico-desktop:~/Desktop/test accent$ ./accent2
------./n
------./ttn
------./tt/tUeestn
------./accent.sh~n
------./accent.shn
------./lklkl lklkl 545 "Én
------./accentn
------./accent2n
------./liste.txtn
------./accent2~n
avec comme structure de fichier:
nico@nico-desktop:~/Desktop/test accent$ find ./
./
./tt
./tt/tUeest
./accent.sh~
./accent.sh
./lklkl lklkl 545 "É
./accent
./accent2
./liste.txt
./accent2~
donc apparement il ne prends pas le "read ligne"
:-(
Dernière modification par linuxnico (Le 02/05/2007, à 11:48)
S'il n'y a pas de solution
c'est qu'il n'y a pas de probleme
SCHADOCK
Hors ligne
#6 Le 02/05/2007, à 12:48
- kaworu
Re : script bash transforme les mots et pas la phrase entiere :-(
alors voila ce que j'ai mis dans mon script:
#!/bin/bash find ./ > liste.txt #for i in $(cat liste.txt); cat < liste.txt | while true do read ligne if [ "$ligne" = "" ]; then break; fi R="`echo "$ligne" | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"`" ; echo "$ligne"------"$R"\n; if [ "$R" != "$ligne" ]; then echo mv "$i" "$R" fi
Salut. Essaye voir comme ça :
#!/bin/bash
find ./ > liste.txt
while read ligne; do
[ "$ligne" = "" ] && break
R="`echo "$ligne" | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"`"
echo "$ligne"------"$R"\n
if [ "$R" != "$ligne" ]; then
echo mv "$i" "$R"
fi
done < list.txt
"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."
Hors ligne