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

shugyosha a écrit :

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

laguespa a écrit :

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' {} \;

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.

Hors ligne