Pages : 1
#1 Le 05/04/2007, à 21:03
- shugyosha
[RESOLU]Script de renomage par lot
Bonjour à tous,
Je voudrais faire ( en script shell si possible ) un bout de code qui permet de virer les accent de mes fichiers de manière recursive.
Je voudrais le faire en script shell je voudraisl'integrer dans mon script general dont le but est la synchronisation de mes musiques avec un disque dur externe en reseau.
Je me suis deja renseigné mais je butte sur un probleme : la recursivité !!!
en effet, ce topic donnait des solutions au probleme du renommage.
Cependant impossible de le faire de manière recursive...
j'ai essayé avec :
ls -R /repertoire_a_parcourir | rename 's/é/e/g'
mais sa me marque une erreur disant que le fichier spécifié n'existe pas...
si quelqu'un a une idée ...
Dernière modification par shugyosha (Le 06/04/2007, à 09:21)
Hors ligne
#2 Le 05/04/2007, à 21:21
- JoelS
Re : [RESOLU]Script de renomage par lot
si quelqu'un a une idée ...
# man find
Hors ligne
#3 Le 06/04/2007, à 09:21
- shugyosha
Re : [RESOLU]Script de renomage par lot
Wahou sa marche ^^
Merci !!!!
Hors ligne
#4 Le 06/04/2007, à 12:54
- AmI2Blame4
Re : [RESOLU]Script de renomage par lot
Bonjour,
j'ai eu récemment à traiter toute une arborescence avec énormément de défaut, notamment d'encodage, voilà un petit script tcl (of my vomposition) permettant de traiter la chose et faire des remplacements, j'ai mis la destination vers /tmp pour plus de prudence :
# c'est ici qu'on rectifie les choses
proc nom { chemin } {
set r [encoding convertfrom utf-8 $chemin]
set r [string map {\ _ é e è e à a À A ! _ , _ ô o ' _ : {} \" {} ... . .. . .... .} $r]
return $r
}
proc Parcours_Arborescence { repertoire } {
global ListeRep ListeFic
if {[catch {cd $repertoire}]} {
puts "mauvais répertoire $repertoire"
return
}
set ListeRep ""
set ListeFic ""
set contenu [glob -nocomplain *]
# discrimination répertoire / fichier
foreach element $contenu {
if [file isdirectory $element] {
lappend ListeRep $element
} else {
lappend ListeFic $element
}
}
# pour les fichiers, on fait le travail demandé...
foreach fic $ListeFic {
set nold [file join $repertoire $fic]
set n [nom $nold]
set n ${::dest}$n
file mkdir [file dirname $n]
if {[catch {file copy $nold $n}]} {
puts "conversion échouée :\n$nold\n->$n\n"
}
}
# pour les répertoires, on les parcourt
foreach rep $ListeRep {
Parcours_Arborescence [file join $repertoire $rep]
}
}
set dest /tmp
Parcours_Arborescence /travail/sarah
C'est sans doute pas très académique et c'est plutôt un canon pour tuer une mouche mais ça m'a permis de virer les accents, les espaces et autres bizarreries qu'il y avait dans les noms (triples points parfois!) etc (cf 1ere procédure).
Hors ligne
#5 Le 08/04/2007, à 17:56
- laguespa
Re : [RESOLU]Script de renomage par lot
Bonjour.
Comment vous en êtes vous sorti avec find ?
J'essaie
find -depth -name *é* | rename 's/é/e/g' *
mais je n'obtiens rien.
Merci.
Hors ligne
#6 Le 08/04/2007, à 21:25
- naholyr
Re : [RESOLU]Script de renomage par lot
find -depth -name *é* | rename 's/é/e/g' *
Normal, ce n'est pas comme ça que ça marche. Le pipe "|" ne sert pas à passer des arguments, mais à rediriger la sortie d'une commande vers l'entrée d'une autre. Si une commande est censée «lire» du texte, tu vas pouvoir lui donner directement de cette façon sans avoir à le taper à la main.
Donc ton "*" ne sert à rien.
Il y a "xargs" qui permet de faire ce que tu veux : "xargs commande" va lire ce que tu tapes au clavier et le passer en argument de "commande" (il remplace les sauts de ligne par des espaces). Concrètement, ça va être très utile avec le pipe : "ls | xargs echo" va te sortir une version «compactée» de "ls".
Bref, dans ton cas, c'est donc find -depth -name *é* | xargs rename 's/é/e/g' que tu voulais exécuter.
Note que "find" est bien fait et possède l'argument "-exec" qui exécute une commande en remplaçant {} par chaque fichier trouvé : find -depth -name *é* -exec rename 's/é/e/g' {} \;
Messagerie instantanée : naholyr@jabber.fr
Envoyer vos images sur le web d'un clic !
Choix du système à rebooter (graphique)
Hors ligne
#7 Le 09/04/2007, à 09:02
- laguespa
Re : [RESOLU]Script de renomage par lot
Très bien, merci.
find -depth -name *é* -exec rename 's/é/e/g' {} \;
J'ai essayé cette commande, elle fonctionne mais ne descends pas au fonds de mon arborescence. J'ai une arborescence à 8 niveaux de sous-répertoires par endroits. Par contre si je descends de quelques sous-répertoires et que je lance la commande les fichiers qui n'avaient pas été traités le sont. Etrange non ?
Hors ligne
#8 Le 09/04/2007, à 11:54
- naholyr
Re : [RESOLU]Script de renomage par lot
Ajoute "-type f" pour ne renommer que les fichiers, je pense qu'il doit y avoir un souci avec le fait qu'il essaye de traiter les dossiers avant de rentrer dedans.
Messagerie instantanée : naholyr@jabber.fr
Envoyer vos images sur le web d'un clic !
Choix du système à rebooter (graphique)
Hors ligne