[Résolu] AWK pour renomer plein de fichiers

Bonjour,

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+

Bonjour,

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

Salut micky979

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+

RE salut

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.

bref… je coince

Bonjour,

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.

Merci,
Ta solution est… n fois plus jolie et plus efficace.
Je teste cela demain matin.
et je te tiens au courant
A+

Sinon,
ce serait pas plus simple avec la commande rename?
genre $ rename 's/é/e/g' *

Voir même

Ah merci je ne connaissais pas rename.
Il y a aussi mmv qui a l’air pas mal.

Je crois qu’un certain nombre de mes scripts vont devenir plus courts :wink:

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+

Tu as fais comment ? Comme ça ?

salut,
bah je crois:

$ 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

Il me semble non?
A+

Au temps pour moi essaie sans le g à la fin

Après pour le “**/*” il faut avoir zsh ou bash dans une version au moins égale à 4.

Salut MisterFreez

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

et puis c’est tout!
snif snif

Bizarre chez moi ça passe :

% 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.

Salut MisterFreez

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 ???)

bref… je comprends de moins en moins!
A+

Salut,
j’ai trouvé une solution… qui vaut ce qu’elle vaut:

IFS="\n";for i in *;do mv $i $(echo $i | sed -r 's/é/e/g; s/è/e/g; s/ê/e/g; s/\?/_/g; s/\ /_/g');done 2> /dev/null

Cette solution remplace les accents, le caractere “?” par “" et l’espace par "”.
On peut prolonger la suite…longtemps

Merci à tous

Mon dieu je suis bigleu ! :open_mouth:

Je me permet une dernière remarque :

Devrais marcher (je sais pas pour le g à la fin). Si ça marche pas je jure de ne plus poster sur le forum « Programmation ».

Salut MisterFreez

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.

Je penses donc le problème résolu.

Merci à tous