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 17/02/2011, à 17:32

Jean-paul 3

[Résolu] renommage fichier en masse depuis fichier de translation

bonjour,
je dois renommer une série de fichiers (environ 300) mais en respectant un nommage très précis et différent pour chaque fichier (sans toucher aux extensions).
le fichier AA devient BB
le fichier BC devient ZN
etc, etc ...
j'ai pour cela un fichier de conversion.

Y' a t-il moyen de scripter ce renommage :=))))
D'avance merci

Dernière modification par Jean-paul 3 (Le 28/02/2011, à 23:04)

Hors ligne

#2 Le 17/02/2011, à 22:15

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Bonjour,

sous quelle forme se présente les données dans ton fichier de conversion ?

Si possible donne un extrait de quelques lignes du fichier de conversion, ce sera plus clair wink.

Dernière modification par herberts (Le 17/02/2011, à 22:16)

Hors ligne

#3 Le 18/02/2011, à 21:28

Jean-paul 3

Re : [Résolu] renommage fichier en masse depuis fichier de translation

bonjour et merci de t'intéresser à mon petit souci  big_smile
en fait je n'ai pas encore les fichiers (je dois les recevoir dans une dizaine de jours)
par contre je sais que je devrais renommer l'ensemble dans la journée, que cela deviendra récurrent et j'ai donc tout de suite penser à un script.
Malheureusement, je bidouille en ligne de commande, un peu sed mais pas suffisamment pour m'en sortir seul.

Alors voilà,
je vais recevoir environs 3 à 400 fichiers (shoots photos) que je dois renommer (en fait changer de référence).
Soit les fichiers reçus, par exemple :
23568AA
23568AB
23568ABB
24125AC
24708AB
24708BB
24708BCC
25311AA
25608AB
etc....
une série de 5 chiffres donc suivi de 2 ou 3 lettres (la même référence en "chiffre" peut revenir plusieurs fois dans la liste mais suivi de lettres différentes) et le but est de renommer ces références (uniquement les numéros), on me donne pour cela un fichier de conversion (vraisemblablement du Excel mais que je peux transformer en CSV) du style :

23568      659842
24125     245636
24708     447815
25311     854214
25608     214877
etc...

et donc les référence (noms de fichiers) deviennent
659842AA
659842AB
659842ABB
245636AC
447815AB
447815BB
447815BCC
854214AA
214877AB

Je dois donc pouvoir gagner en temps et en risque d'erreur et en plus cela risque de devenir récurrent !
Si quelqu'un peut m'aider ?
d'avance merci

Hors ligne

#4 Le 18/02/2011, à 23:16

grim7reaper

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Ça doit être faisable en Bash, mais comme je ne suis pas particulièrement doué avec ce langage je peux te proposer un script Perl à la place.
Ça te vas où il te faut absolument un truc en Bash ?

Dernière modification par grim7reaper (Le 18/02/2011, à 23:17)

Hors ligne

#5 Le 18/02/2011, à 23:28

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

J'ai bataillé un peu sur un script bash, mais j'ai pas encore tout à fait fini, donc si le perl te va… wink

quoique ça me fait découvrir des nouveaux trucs en bash, ça a ses bon côtés.

Hors ligne

#6 Le 18/02/2011, à 23:46

grim7reaper

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Moi le script Perl est fini, mais que ça ne t'empêches pas de finir celui en Bash.
Ça permettra de voir deux approches et puis comme ça il aura le choix smile

Dernière modification par grim7reaper (Le 18/02/2011, à 23:46)

Hors ligne

#7 Le 19/02/2011, à 00:18

ehmicky

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Salut,
Si tous les fichiers dont le nom est à modifier sont dans le répertoire courant, et que le répertoire courant ne contient que les fichiers à modifier, et que le fichier .csv est bien comme tu dis (première colonne et deuxième colonne) :

rename "$(awk '{ printf "s/^"$1"/"$2"/;" }' /chemin/vers/csv)" *

Edit : corrigé.

Dernière modification par ehmicky (Le 19/02/2011, à 00:31)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#8 Le 19/02/2011, à 00:30

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Pfff, pas la peine de faire le malin avec ton tout petit code ehmicky… Et dire que j'étais content de moi hmm (Faut vraiment que je regarde awk et sed de plus près un de ces jours).

M'enfin je poste quand même ma solution tongue

while read i; do a=`echo $i | cut -d \  -f 1`; b=`echo $i | cut -d \  -f 2`; for x in "$a"[A-Z]*; do mv "$x" "${x//$a/$b}"; done ; done < chemin/vers/csv

edit : idem qu'ehmicky, il faut lancer ça dans le répertoire où sont situés les fichiers à renommer bien entendu. Et c'est soumis à ce que le fichier csv soit bien formé comme tu l'as dit.

Dernière modification par herberts (Le 19/02/2011, à 00:33)

Hors ligne

#9 Le 19/02/2011, à 00:33

ehmicky

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Non mais mon code a encore un problème parce que les caractères du fichier csv sont interprétés comme des regexps, donc si par exemple il y a un point, il sera pas interprété littéralement mais comme une regexp.

Dernière modification par ehmicky (Le 19/02/2011, à 00:35)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#10 Le 19/02/2011, à 00:36

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Allez grim7reaper, balance ton script, plus on est de fous… smile

ehmicky : bah le mien à l'air de marcher d'après mes tests, le seul truc c'est qu'en copiant le code dans un fichier bash ou sh ça marche pas alors que lancé directement en console ça marche (?). En tout cas il y a surement moyen de faire plus court ^^.

Dernière modification par herberts (Le 19/02/2011, à 00:37)

Hors ligne

#11 Le 19/02/2011, à 00:38

grim7reaper

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Bon, bah moi j'ai fait un truc plus long mais il a l'avantage d'être plus lisible (du moins de mon point de vue)
Et après on dit que c'est le Perl qui est Read-Only tongue

Pour le CSV je suis parti sur la virgule en tant que séparateur (définition de base du format CSV), mais ça se modifie facilement.
Idem pour le répertoire de travail et la position du fichier qui contient les règles de conversions : il suffit de modifier les variables correspondantes.

#!/usr/bin/perl -w
use strict;

# Nom du fichier CSV qui contient les règles de renommage.
my $conv_filename = "conversion.csv";
# Répertoire qui contient les fichiers à renommer.
my $working_dir   = ".";
# Séparateur utilisé dans le fichier CSV.
my $separator     = ",";
# Hash qui contient les règles de renommage.
my %conv_rules;

# Lecture des règles de renommage.
open(CONV_FILE, "<$conv_filename") || die "Cannot open $conv_filename\n$!\n";
while(<CONV_FILE>)
{
    if(/(\d+)$separator(\d+)/)
    {
        $conv_rules{$1} = $2;
    }
}
close(CONV_FILE) || die "Cannot close $conv_filename\n$!\n";

# On se déplace dans le répertoire contenant les fichiers.
chdir($working_dir) || die "Cannot chdir into $working_dir\n$!\n";


# Pour chaque fichiers de la liste.
foreach my $old (glob('*'))
{
    # S'il commence par une suite de chiffres.
    if($old =~ /(\d+)(.*)/)
    {
        # S'il existe une règle de renommage.
        if(defined $conv_rules{$1})
        {
            # On crée le nouveau nom.
            my $new = $conv_rules{$1}.$2;
            # On renomme le fichier.
            rename($old, $new);
        }
    }
}

Bon ça fait un bail que je n'ai pas fait de Perl donc je suis un peu rouillé (on doit pouvoir faire plus court tout en restant lisible).


herberts a écrit :

En tout cas il y a surement moyen de faire plus court ^^.

Ha si on commence à faire du golf, ça peut aller loin (bien que j'ai pas mal perdu la main ^^)

Dernière modification par grim7reaper (Le 19/02/2011, à 00:52)

Hors ligne

#12 Le 19/02/2011, à 00:46

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

à vrai dire j'étais parti pour faire un joli script bien propre dans le genre du tien, avec les définitions de variables au début et en leur donnant des noms compréhensibles et tout.

Mais comme je le dit au dessus, une fois collé dans un fichier texte, ben le script ne voulait pas s'exécuter hmm. du coup j'ai abrégé mes noms de variables pour pas faire une ligne de quinze kilomètres. wink

Bon, avec tout ça j'espère que tu trouvera ton bonheur Jean-paul 3

PS : en l'état actuel, mon script marche avec comme séparateur des tabulations ou des espaces.

Hors ligne

#13 Le 19/02/2011, à 00:49

ehmicky

Re : [Résolu] renommage fichier en masse depuis fichier de translation

herberts a écrit :

Allez grim7reaper, balance ton script, plus on est de fous… smile

ehmicky : bah le mien à l'air de marcher d'après mes tests, le seul truc c'est qu'en copiant le code dans un fichier bash ou sh ça marche pas alors que lancé directement en console ça marche (?). En tout cas il y a surement moyen de faire plus court ^^.

En théorie, ça marche autant en console que non (du moins de mon côté).
Si tu as utilisé des virgules dans le .csv , tu peux faire :

rename "$(awk -F, '{ printf "s/^"$1"/"$2"/;" }' /chemin/vers/csv)" *

Dernière modification par ehmicky (Le 19/02/2011, à 00:52)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#14 Le 19/02/2011, à 00:55

Jean-paul 3

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Dites, franchement
vos scripts sont des trucs de "ouf" (dans le bon sens du terme bien sûr)
smile
Je regarde demain, enfin aujourd'hui dans la journée et vous tient au courant

en tout cas un vrai grand merci !!!

tongue tongue

Hors ligne

#15 Le 19/02/2011, à 01:07

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Petite précision concernant mon "script" :

bien que j'ai effectué des test, je te conseille néanmoins de l'exécuter sur une copie des fichier et non sur les originaux. Comme on n'a pas accès aux noms des fichiers ni au cvs que tu auras, on sait jamais, ça serait dommage de les "bousiller" à cause d'un cas non prévu wink

Hors ligne

#16 Le 19/02/2011, à 01:14

grim7reaper

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Idem pour le mien wink

Et si tu as des doutes ou des questions, n'hésites pas.

Hors ligne

#17 Le 20/02/2011, à 18:52

Jean-paul 3

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Salut à nouveau,
désolé je n'ai pas trouvé le temps de tester les différents scripts (week-end chargé !)
en même temps je ne pensais pas que mon problème aurait plusieurs retours smile

J'ai pour l'instant testé le script d'ehmicky
et il fonctionne tongue

je prends le temps demain de tester les 2 autres et je reviens vers vous
J'aime bien apprendre et comprendre
Merci à vous !

Dernière modification par Jean-paul 3 (Le 20/02/2011, à 18:53)

Hors ligne

#18 Le 20/02/2011, à 20:10

ehmicky

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Ca c'est typiquement le genre de trucs où on est trop content de savoir faire des scripts là où beaucoup de gens auraient passé leur dimanche à renommer des fichiers à la main via Nautilus/Windows explorer !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#19 Le 20/02/2011, à 20:21

wawan60

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Je sais que ce n'est pas le logiciel vraiment voulu mais je propose Jnome**

En interface graphique. Voilà, bonne soirée à vous.


Mon site -> www.retro-wuseum.hostzi.com
Grace Hopper : Pour moi, la programmation est plus qu'un art appliqué important. C'est aussi une ambitieuse
quête menée dans les tréfonds de la connaissance

Hors ligne

#20 Le 27/02/2011, à 22:44

Jean-paul 3

Re : [Résolu] renommage fichier en masse depuis fichier de translation

Bon désolé, la réponse n'est pas des plus "rapides" mais je n'avais vraiment pas beaucoup de temps cette semaine sad

j'ai donc pris le temps de tester également aujourd'hui les scripts de herberts et grim7reaper et ils fonctionnent également.
Merci donc à vous 3.

j'ai réussi à retrouver il y a quelque temps le bouquin d'O Reilly
Sed et awk : programmation avancée

et dés que j'ai un peu de temps je m'y plonge et "bidouille" par contre je suis loin d'être de votre niveau (pareil pour perl)
le problème c'est de pratiquer régulièrement et de monter doucement mais sûrement dans la difficultés afin d'avancer.

Cela (me) demande beaucoup, beaucoup de temps

mais quand on voit les résultats tongue
(j'ai encore du boulot, moi !)

Encore merci !

Hors ligne

#21 Le 27/02/2011, à 23:02

herberts

Re : [Résolu] renommage fichier en masse depuis fichier de translation

De rien smile. Et Penses à passer ton sujet en résolu en éditant ton premier message et en ajoutant [Résolu] au début du titre.

Hors ligne