Je cherche à renommer plein de fichier qui viennent de Windows
je fais un ls -alR | awk '{gsub(/é/, “e”); print $0}'
j’ai bien une liste des fichiers sans le caractère “é”
2 problèmes à cela:
je n’arrive pas à le combiner avec un
mv old_name new_name
Je pense qu’en passant par les expressions régulières du type
[éèë ] vers [eee_]
ça devrait être beaucoup plus efficace
Mais la non plus, j’y arrive pas
Si quelqu’un a une idée, je suis preneur
Merci A+
Quelques choses comme ceci devrait t’aider mais ce n’est pas avec awk :
find . -type f | while read i
do
printf "${i}\n" | egrep -q [éêëè]
if [ $? -eq 0 ]
then
if [ -e "$(printf "${i}\n" | sed 's/[éêëè]/e/'g)" ]
then
printf "Impossible de renommer ${i}. Le fichier existe deja.\n"
else
mv "${i}" "$(printf "${i}\n" | sed 's/[éêëè]/e/'g)"
fi
fi
done
Ton code fonctionne très bien pour le "e"
je l’ai modifié pour plein d’autres lettres de la façon suivante:
[code]#!/bin/sh
ls | while read i
do
printf “${i}\n” | egrep -q [éêëè]
if [ $? -eq 0 ]
then
if [ -e “$(printf “${i}\n” | sed 's/[éêëè]/e/'g)” ]
then
printf "Impossible de renommer ${i}. Le fichier existe deja.\n"
else
mv “${i}” "$(printf “${i}\n” | sed 's/[éêëè]/e/'g)"
fi
fi
printf “${i}\n” | egrep -q [àäâ]
if [ $? -eq 0 ]
then
if [ -e “$(printf “${i}\n” | sed 's/[àäâ]/a/'g)” ]
then
printf "Impossible de renommer ${i}. Le fichier existe deja.\n"
else
mv “${i}” "$(printf “${i}\n” | sed 's/[àäâ]/a/'g)"
fi
fi
done[/code]
il m’a retiré les accents sur les “e” mais pas sur les “a” en m’insultant:
mv: ne peut évaluer `étèàä.txt’: Aucun fichier ou répertoire de ce type
parce que dans le cas des “a” le fichier a déjà été renommé "eteàä.txt"
Normal mais alors…
Je peux reprendre le LS mais il n’y a pas mieux???
Mais merci quand même, cela me procure une voie de sortie
A+
En fait en mettant des ls à chaque étape, cela fonctionne;
Mais que pour les fichiers, pas pour les répertoires
Peut-être avec “ls -alR” en utilisant l’argument $9 à la place de “${i}\n” qui est le nom du fichier ???
Mais j’ai peur qu’il n’apprécie pas.
Il y a en effet la solution de refaire la boucle avec le ls mais c’est pas tres optimiser.
Une autre solution possible :
ls | while read i
do
printf "${i}\n" | egrep -q [éêëèàäâ]
if [ $? -eq 0 ]
then
if [ -e "$(printf "${i}\n" | sed 's/[éêëè]/e/'g | sed 's/[àäâ]/a/'g)" ]
then
printf "Impossible de renommer ${i}. Le fichier existe deja.\n"
else
mv "${i}" "$(printf "${i}\n" | sed 's/[éêëè]/e/'g | sed 's/[àäâ]/a/'g)"
fi
fi
done
Ceci devrait fonctionner. Préfère le find que la commande ls pour ta recherche.
bonjour à tous
Je m’excuse pour mon retard à répondre… des imprévus…
Je viens d’essayer les scripts rename.
Pour un caractère, impec
Pour plusieurs caracteres, il veux rien savoir.
N’y a-t-il pas un problème de version pour rename???
A+
$ rename 'y/éêèàïç/eeeaic/g' **/*
Bareword found where operator expected at (eval 1) line 1, near "y/éêèàïç/eeeaic/g"
syntax error at (eval 1) line 2, near "y/éêèàïç/eeeaic/g
En effet, sans le g la commande passe sans erreur.
Mais elle ne fait rien.
J’ai essayé avec un fichier étè.txt et avec un répertoire étè
franck@PC3:~$ ls | grep é
étè
étè.doc
fsr@PC3:~$
rename 'y/éêèàïç/eeeaic/' **/*
Can't rename étè/eetece�ec.txt eetec/eetece�ec.txt: Aucun fichier ou répertoire de ce type
franck@PC3:~$ ls | grep é
étè
étè.doc
fsr@PC3:~$
fsr@PC3:~$ uname -r
2.6.26-2-686
% ls
çouçou étè ïgyt jhkdsfjhsd
% rename 'y/çéèï/ceei/' *
% ls
ceouceou cigyt citci jhkdsfjhsd
Si tu as juste un répertoire à faire (et pas de sous répertoire) utilise * plutôt que **/*.
Ton problème sinon viens peut être d’un problème d’encage mais je sais pas trop comment t’aider.
Je n’ai pas l’impression que cela fonctionne bien chez toi
çouçou donne ceouceou à la place de coucou
étè donne cigyt à la place de ete
ïgyt donne citci à la place de igyt
je viens d’essayer entre crochet
touch çépasgï
rename 'y/[çéèï]/[ceei]/' *
çépasgï donne cecipasgc] au lieu de cepasgi
j’en conclu que dans tous les cas, cette commande donne
pour une lettre trouvée dans le filtre d’entrée : 2 lettres
pour ç -> ce
pour é -> ci (la je comprends pas)
pour ï -> c] (la non plus ???)
Désolé ta solution ne fonctionne pas.
Certes, je ne peux pas expliquer pourquoi.
Mais que ce soit avec ou sans le g… rien
Bon mais t’affole pas, ça fonctionne comme j’ai montré dans le post précédent.