Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/07/2021, à 20: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, à 20:49)


Lubuntu / Xubuntu-Voyager ==> 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, à 20: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, à 20:48)

Hors ligne

#3 Le 28/07/2021, à 10: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, à 10:54)

Hors ligne

#4 Le 29/07/2021, à 20: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-Voyager ==> 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, à 21: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, à 08:28)

Hors ligne

#6 Le 04/08/2021, à 21: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-Voyager ==> 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, à 11: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

https://forum.ubuntu-fr.org/viewtopic.php?id=282633

Hors ligne