#1 Le 27/07/2021, à 19:15
- domi301
[RESOLU] renommer des accents, find+rename
Salut à tous
j'ai pas mal de fichiers dans divers dossiers, contenant (ou pas...) des caractères accentués que je voudrais remplacer
j'ai créé un petit dossier TMP avec des fichiers de test pour éviter de faire trop de conneries...
$ touch aa aé ééb bèb aébè bbb " a ê a " " é aa b " bê
$ ll
drwxrwxrwx 2 perso perso 20480 juil. 27 20:12 ./
drwxr-xr-x 15 perso perso 57344 juil. 27 19:22 ../
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 aa
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 aé
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 ' a ê a '
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 aébè
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 bbb
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 bê
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 bèb
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 ' é aa b '
-rw-rw-r-- 1 perso perso 0 juil. 27 20:12 ééb
un rename "simple" pourrait faire le boulot
$ find ./TMP -depth -type f -execdir rename -n -d 's/é|è|ê/e/g' {} \;
rename(./bèb, ./beb)
rename(./aé, ./ae)
rename(./aébè, ./aebe)
rename(./bê, ./be)
rename(./ a ê a , ./ a e a )
rename(./ééb, ./eeb)
rename(./ é aa b , ./ e aa b )
mais je coince si j'essaie d'utiliser plusieurs actions rename dans la même commande
$ rename -n -d -e 's/à|â/a/g' -e 's/é|è|ê/e/g' *
syntax error at (user-supplied code) line 2, near "s/à|â/a/g s/é|è|ê/e/g"
il y a un truc qui m'échappe avec la combinaison des -e ...
Dernière modification par domi301 (Le 04/08/2021, à 19:49)
Lubuntu / Xubuntu ==> redonner vie à des machines abandonnées
en cas de besoin => http://forum.ubuntu-fr.org/viewtopic.php?id=1069631
Hors ligne
#2 Le 27/07/2021, à 19:46
- pingouinux
Re : [RESOLU] renommer des accents, find+rename
Bonsoir,
Je ne vois pas l'option -d dans le man.
Essaye :
rename -n -E 's/à|â/a/g' -E 's/é|è|ê/e/g' *
Attention : les fichiers abc et àbc (par exemple), vont donner la même chose.
Édité :
Ou bien
rename -n 's/à|â/a/g;s/é|è|ê/e/g' *
Dernière modification par pingouinux (Le 27/07/2021, à 19:48)
Hors ligne
#3 Le 28/07/2021, à 09:47
- MicP
Re : [RESOLU] renommer des accents, find+rename
Bonjour
Il y a aussi la possibilité de convertir tous les caractères UTF-8 en ASCII :
michel@debbull:~$ maVar="àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇñµ"
michel@debbull:~$ iconv -f utf-8 -t ascii//TRANSLIT <<< $maVar
aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcCnu
michel@debbull:~$
Dernière modification par MicP (Le 28/07/2021, à 09:54)
Hors ligne
#4 Le 29/07/2021, à 19:48
- domi301
Re : [RESOLU] renommer des accents, find+rename
merci de vous etre penché sur mon cas
@pinguinux
j'aurai du préciser que j'étais sur une xub 21.04
-d, --filename, --nopath, --nofullpath
Do not rename directory: only rename filename component of path.
ca fait un peu ceinture et bretelle avec le find -type f
P$ rename -V
/usr/bin/rename using File::Rename version 1.13, File::Rename::Options version 1.10
les combinaisons de -E marchent dans un "simple" rename mais pour combiner avec find je suis passé par les blocs ";"
j'ai fait
$ find ./TMP -depth -type f -exec rename -n -d 's/é|è|ê/e/g;s/à|â|ä/a/g;s/ô|ö/o/g' {} \;
rename(./bèb, ./beb)
rename(./aé, ./ae)
rename(./aébè, ./aebe)
rename(./bê, ./be)
rename(./ a ê a , ./ a e a )
rename(./ééb, ./eeb)
rename(./ é aa b , ./ e aa b )
ca devrait faire le boulot, merci
NB: pour ne pas perdre mes rangements de sous-dossier il faut utiliser -exec et non -execdir
(j'ai prévu une bonne sauvegarde avant de me lancer...)
@MicP
pouvoir traiter tout ca d'un seul coups serait classe maVar="àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇñµ"
au lieu d'empiler les substitutiions rename
?? mais j'ai pas réussi à associer iconv avec le find de recherche des fichiers
?? ou alors il faut que je passe par un fichier intermediaire contenant les fichiers et les arbos avant d'appliquer iconv dessus (mais ce serait lourd)
Lubuntu / Xubuntu ==> redonner vie à des machines abandonnées
en cas de besoin => http://forum.ubuntu-fr.org/viewtopic.php?id=1069631
Hors ligne
#5 Le 29/07/2021, à 20:43
- MicP
Re : [RESOLU] renommer des accents, find+rename
Bonjour
La ligne de commande qui transformera en ASCII
tous les noms des fichiers et des répertoires qui existent dans l'arborescence du répertoire /chemin/arborescence/à/traiter
find /chemin/arborescence/à/traiter -depth -execdir bash -c 'f="$0"; mv --backup=numbered "$f" "${f%/*}/$(iconv -f UTF8 -t ASCII//TRANSLIT <<< ${f##*/})" 2>/dev/null' {} \;
=======
Le test :
Préparation du contexte pour ce test :
Le répertoire que je vais créer pour ce test et qui contiendra l'arborescence à traiter sera nommé : ~/tests
michel@debbull:~$ shopt -s globstar; mkdir -p ~/tests/rép{A,B}/sousRép{1,2} && for rep in ~/tests/**; do touch $rep/{aa,äa,aä,ça,µA,'es pacé',öh,ôh}; done; shopt -u globstar; ls -R ~/tests
/home/michel/tests:
aa aä äa ça 'es pacé' ôh öh répA répB µA
/home/michel/tests/répA:
aa aä äa ça 'es pacé' ôh öh sousRép1 sousRép2 µA
/home/michel/tests/répA/sousRép1:
aa aä äa ça 'es pacé' ôh öh µA
/home/michel/tests/répA/sousRép2:
aa aä äa ça 'es pacé' ôh öh µA
/home/michel/tests/répB:
aa aä äa ça 'es pacé' ôh öh sousRép1 sousRép2 µA
/home/michel/tests/répB/sousRép1:
aa aä äa ça 'es pacé' ôh öh µA
/home/michel/tests/répB/sousRép2:
aa aä äa ça 'es pacé' ôh öh µA
michel@debbull:~$
Lancement de la ligne de commande pour convertir en ASCII
tous les noms des fichiers et des répertoires qui sont dans l'arborescence du répertoire ~/tests/
puis affichage suivit du nettoyage :
michel@debbull:~$ find ~/tests -depth -execdir bash -c 'f="$0"; mv --backup=numbered "$f" "${f%/*}/$(iconv -f UTF8 -t ASCII//TRANSLIT <<< ${f##*/})" 2>/dev/null' {} \;
michel@debbull:~$
michel@debbull:~$ ls -R ~/tests; rm -Rf ~/tests # Pour afficher les nouveaux noms des fichiers et tout effacer ensuite
/home/michel/tests:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ repA repB uA
/home/michel/tests/repA:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ sousRep1 sousRep2 uA
/home/michel/tests/repA/sousRep1:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ uA
/home/michel/tests/repA/sousRep2:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ uA
/home/michel/tests/repB:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ sousRep1 sousRep2 uA
/home/michel/tests/repB/sousRep1:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ uA
/home/michel/tests/repB/sousRep2:
aa aa.~1~ aa.~2~ ca 'es pace' oh oh.~1~ uA
michel@debbull:~$
Dernière modification par MicP (Le 30/07/2021, à 07:28)
Hors ligne
#6 Le 04/08/2021, à 20:09
- domi301
Re : [RESOLU] renommer des accents, find+rename
double merci
1) ca marche impec (je n'en doutais pas...)
2) ca m'a donné l'occasion de creuser les regexp que je n'avais fait qu'effleurer avant
j'explique la commande pour ceux que ca interresserait, sous réserve de ce que j'ai compris...
-execdir command {} +
Like -exec, but the specified command is run FROM the subdirectory containing the
matched file, which is not normally the directory in which you started find.
==> on travaille en chemin relatif, toujours sur me dernier element de l'arbo qui peut etre un fichier final ou un sous-dossier
ca permet de ne pas créer de soucis si un sous dossier a été renommé
f=$0
charge dans f le {} donné par le find comme variable de travail
en pratique juste " ./element" grace au exec dir
--backup=numbered
pour ne pas ecraser si un fichier cible existe avant (bonne idée...)
${f%/*}
${parameter%word} Remove matching suffix pattern. the shortest matching pattern (the ``%'' case)
conserve toute la partie de l'arbo au dessus du dernier élément et enleve la toute derniere partie apres /
en pratique donne juste "./" avec execdir
${f##*/}
${parameter##word} Remove matching prefix pattern. the longest matching pattern (the ``##'' case) deleted.
ne conserve que element final, nom du fichier ou du sous-dossier courant
qui sera transmis a iconv pour conversion des accents
pour completer =>
https://www.gnu.org/software/bash/manua … nsion.html
https://www.gnu.org/software/bash/manua … ching.html
Lubuntu / Xubuntu ==> redonner vie à des machines abandonnées
en cas de besoin => http://forum.ubuntu-fr.org/viewtopic.php?id=1069631
Hors ligne
#7 Le 06/08/2021, à 10:17
- clahor
Re : [RESOLU] renommer des accents, find+rename
bonjour
dans le meme style il y a la commande detox qui permet de renommer des fichiers
Hors ligne