-PERL- Renommer photo en fonction fichier

Résolu/Fermé
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011 - 18 juin 2008 à 15:33
 Belin - 16 juil. 2008 à 17:09
Bonjour,

je souhaiterais mettre en place un bout de script perl.

Voilà la situation :

- j'ai un dossier trombinoscope avec les portraits des employés. Les noms des photos correspondent aux noms des personnes.

- j'ai un fichier excel, avec 2 colonnes : une le matricule des personnes, l'autre leur noms.


=> Objectif :

Renommer toutes les photos en remplaçant le nom des personnes par leur matricule ...

Une idée ?

Je sais comment mettre dans un tableau les valeurs noms, matricule ... mais comme dire :

" si nom_photo = nom_user, renommer en mettant la matricule en face de nom_user " ...

Merci de votre aide !! :)
A voir également:

12 réponses

phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
19 juin 2008 à 11:02
Une petite idée ?? :s
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
19 juin 2008 à 13:31
Salut,

pour ne pas se compliquer avec la lecture du fichier .xls je te propose d'enregistrer le fichier excel en format csv (séparateur ; )


Par exemple supposons que le fichier .csv est :

titi;111
toto;222
tata;333


Et que le répertoire trombinoscope contient ces fichiers
titi.jpg
toto.jpg
tata.jpg


Tu peux essayer comme ça (ATTENTION : je n'ai pas testé)
#!/usr/bin/perl
use strict;use warnings;

open FILE,"fic.csv" or die "E/S : $!\n";

my $rep='/chemin/vers/trombinoscope/'; # à modifier avec 
                                       #ton répertoire de test d'abord
while(<FILE>)(
  /(.*);(.*)/;
  rename("${rep}${1}.jpg","${2}.jpg");
}
__END__
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
19 juin 2008 à 20:05
Salut,

maintenant c'est testé ;-)
j'ai écrit dans chaque fichier le nom sans extension pour que tu voies que 333.jpg correspond bien à tata.jpg suite au fichier .csv tata;333
lami20j@debian:~/trash/trombinoscope$ pwd
/home/lami20j/trash/trombinoscope
lami20j@debian:~/trash/trombinoscope$ ls -1
excel.csv
renommer.pl
tata.jpg
titi.jpg
toto.jpg
lami20j@debian:~/trash/trombinoscope$ cat tata.jpg
tata
lami20j@debian:~/trash/trombinoscope$ cat titi.jpg
titi
lami20j@debian:~/trash/trombinoscope$ cat toto.jpg
toto
lami20j@debian:~/trash/trombinoscope$ cat renommer.pl
#!/usr/bin/perl
use strict;use warnings;

open FILE,"excel.csv" or die "E/S : $!\n";

my $rep='/home/lami20j/trash/trombinoscope/'; # à modifier avec
                                              #ton répertoire de test d'abord
while(<FILE>){
  /(.*);(.*)/;
  print "${rep}${1}.jpg -> ${rep}${2}.jpg\n";
  rename("${rep}${1}.jpg","${rep}${2}.jpg");
}
__END__
lami20j@debian:~/trash/trombinoscope$ cat excel.csv
titi;111
toto;222
tata;333
lami20j@debian:~/trash/trombinoscope$ perl renommer.pl
/home/lami20j/trash/trombinoscope/titi.jpg -> /home/lami20j/trash/trombinoscope/111.jpg
/home/lami20j/trash/trombinoscope/toto.jpg -> /home/lami20j/trash/trombinoscope/222.jpg
/home/lami20j/trash/trombinoscope/tata.jpg -> /home/lami20j/trash/trombinoscope/333.jpg
lami20j@debian:~/trash/trombinoscope$ cat 111.jpg
titi
lami20j@debian:~/trash/trombinoscope$ cat 222.jpg
toto
lami20j@debian:~/trash/trombinoscope$ cat 333.jpg
tata
lami20j@debian:~/trash/trombinoscope$ ls -1
111.jpg
222.jpg
333.jpg
excel.csv
renommer.pl
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
20 juin 2008 à 11:56
:) effectivement très bien le script, j'avais essayé de faire quelque chose de similaire mais bon .. j'avais beaucoup plus de ligne et ca ne marchait pas entièrement ... donc un grand merci !

juste une dernière chose : mes noms de fichiers photos ont un espace au milieu .. ex : Pierre MARTIN.JPG ...

Du coup le script ne les renomme pas ... je pense qu'il doit juste y avoir un paramètre à passer, mais je ne sais pas lequel et où :$

merci d'avance pour ton aide !
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011 > phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
20 juin 2008 à 12:00
juste petite precision quand je dit qu'il y a un espace qui est bloquant, en fait c'est bloquant pour accéder à la photo ..

les variables ${rep}${1} forment => /home/vincent/TROMBI/Pierre MARTIN.JPG

là, "normal" le programme n'y accède pas, il bloque à /home/vincent/TROMBI/Pierre

merci
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011 > phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
20 juin 2008 à 12:38
bon .. c'est peut être pas la meilleure méthode mais si ca interesse quelqun, positionnez vous dans le répertoire contenant les fichiers avec espaces et tappez

rename 's/:blank:/_/g' *

ça remplace tous les espaces par des " _ "


:)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
20 juin 2008 à 23:23
Salut,

c'est bizarre, voici chez moi
lami20j@debian:~/trash/trombinoscope$ pwd
/home/lami20j/trash/trombinoscope
lami20j@debian:~/trash/trombinoscope$ ls -1
excel.csv
Pierre MARTIN.jpg
renommer.pl
tata.jpg
titi.jpg
toto.jpg
lami20j@debian:~/trash/trombinoscope$ cat renommer.pl
#!/usr/bin/perl
use strict;use warnings;

open FILE,"excel.csv" or die "E/S : $!\n";

my $rep='/home/lami20j/trash/trombinoscope/'; # à modifier avec
                                              #ton répertoire de test d'abord
while(<FILE>){
  /(.*);(.*)/;
  print "${rep}${1}.jpg -> ${rep}${2}.jpg\n";
  rename("${rep}${1}.jpg","${rep}${2}.jpg");
}
__END__
lami20j@debian:~/trash/trombinoscope$ cat excel.csv
titi;111
toto;222
tata;333
Pierre MARTIN;999999
lami20j@debian:~/trash/trombinoscope$ perl renommer.pl
/home/lami20j/trash/trombinoscope/titi.jpg -> /home/lami20j/trash/trombinoscope/111.jpg
/home/lami20j/trash/trombinoscope/toto.jpg -> /home/lami20j/trash/trombinoscope/222.jpg
/home/lami20j/trash/trombinoscope/tata.jpg -> /home/lami20j/trash/trombinoscope/333.jpg
/home/lami20j/trash/trombinoscope/Pierre MARTIN.jpg -> /home/lami20j/trash/trombinoscope/999999.jpg
lami20j@debian:~/trash/trombinoscope$ ls -1
111.jpg
222.jpg
333.jpg
999999.jpg
excel.csv
renommer.pl
En fait l'expression régulière /(.*);(.*)/;récupère le nom complet (avec ou sans esapce)
C'est peut être à cause de ton fichier .csv
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
1 juil. 2008 à 10:54
Désolé de te répondre si tard lamij20j mais le scirpt fonctionne très bien, je ne sais pas ce qui se passait.

Donc comme d'hab: merci beaucoup pour ton aide, rapide et efficace !! :D

Vincent
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Ce code est exactement ce que je cherchais, je souhaiterai juste savoir s'il est possible d'avoir des entrées dans la listes qui ne sont pas présentes sous forme d'images, et donc ne convertir que les images présentes.

D'avance merci, vous êtes mes biefaiteurs du jour !
0
Hi !

Alors quand je teste sous mac, j'ai cette erreur :

BELDEMXXXX:~/Desktop/wolf/test admin$ perl 
.DS_Store      2.JPG          6.JPG          Classeur1.csv  
1.JPG          4.JPG          7.JPG          script.pl      
10.JPG         5.JPG          8.JPG          
BELDEMXXXX:~/Desktop/wolf/test admin$ perl script.pl 
syntax error at script.pl line 9, near ")(
  "
Unmatched right curly bracket at script.pl line 11, at end of line
syntax error at script.pl line 11, near "}"
Execution of script.pl aborted due to compilation errors.
BELDEMXXXX:~/Desktop/wolf/test admin$ 


D'autre part, je souhaiterai savoir si c'est génant si j'ai des numéros dans les deux colonnes (et donc il peut trouver le nom du fichier dans la seconde colonne)
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
1 juil. 2008 à 11:02
salut Belin !

as tu bien fait un copier coller du code de Lami20j ??

#!/usr/bin/perl
use strict;use warnings;

open FILE,"excel.csv" or die "E/S : $!\n";

my $rep='/home/lami20j/trash/trombinoscope/'; # à modifier avec
#ton répertoire de test d'abord
while(<FILE>){
/(.*);(.*)/;
print "${rep}${1}.jpg -> ${rep}${2}.jpg\n";
rename("${rep}${1}.jpg","${rep}${2}.jpg");
}
__END__


dans ton message d'erreur on dirait qu'il te manque " } " à la fin de ton scirpt.

Sinon pour ta question je ne pense que cela soit gênant .. en gros tu veux remplacer le fichier 12.jpg par 13.jpg ?
Dans tous les cas le script prend un fichier, le cherche dans le .csv et le renomme en fonction de ce qu'il y a dans la 2eme colonne ... à partir de là tu y met ce que tu veux :)
0
Merci pour ta réponse. Il devait bien y avoir une erreur, néanmoins ça foire encore.

la j'ai :

BELDEMXXXX:~/Desktop/wolf/test admin$ ls 
1.JPG           2.JPG           5.JPG           7.JPG           Classeur1.csv
10.JPG          4.JPG           6.JPG           8.JPG           script.pl
BELDEMXXXX:~/Desktop/wolf/test admin$ cat Classeur1.csv 
9;94BELDEMXXXX:~/Desktop/wolf/test admin$ man cat
BELDEMXXXX:~/Desktop/wolf/test admin$ ls
1.JPG           2.JPG           5.JPG           7.JPG           Classeur1.csv
10.JPG          4.JPG           6.JPG           8.JPG           script.pl
BELDEMXXXX:~/Desktop/wolf/test admin$ perl script.pl 
9.JPG -> /Users/admin/Desktop/wolf/test/94.JPG
BELDEMXXXX:~/Desktop/wolf/test admin$ ls
1.JPG           2.JPG           5.JPG           7.JPG           Classeur1.csv
10.JPG          4.JPG           6.JPG           8.JPG           script.pl


avec comme fichier csv :


1	14
2	24
3	34
4	44
5	54
6	64
7	74
8	84
9	94


Quant à ma question : je dois renommer des fichiers à 6 chiffres en fichiers à 12 chiffres, et je veux pas qu'il me trouve le nom dans la partie à 12 chiffres.
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
1 juil. 2008 à 11:44
Dans ton dossier "test admin" tu as pas de fichier 9.JPG .. alors je ne sais pas si j'ai loupé quelque chose, mais en tout cas il ne pourras pas te le renommer en 94.JPG ...

sinon as tu un message d'erreur particulier ?
0
Belin > phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
1 juil. 2008 à 11:52
Et le fait de pas avoir de 9 dans le dossier, c'était fait exprès : en effet certaines entrées dans la listes ne sont pas là en tant qu'images.
0
Voilà, ça a l'air de marcher. Le problème venait du csv : quand je le cat, ça me fesait 9;94, alors que pourtant quand excel l'ouvre ça m'affiche tout.

Merci les gens je vous aime d'amour, parce que me mettre au shell juste pour ça...
0
phoenix1984 Messages postés 30 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 9 décembre 2011
1 juil. 2008 à 12:02
cool si ça marche pour toi aussi :)
0
ouep le problème venait de excel 2k8 pour mac, un csv de excel de windows ou un fait main avec Textwrangler (je n'arrive pas a comprendre pourquoi apple a pas su foutre un éditeur de texte tout con décent et a mis une bouse rtf-only comme textEdit) ça marche.
0
Yop, encore moi, j'ai essayé de faire marcher le script sous windows avec activeperl et en changeant le fichier :


#!c:\Perl\bin
use strict;use warnings;

open FILE,"Classeur1.csv" or die "E/S : $!\n";

my $rep='c:\test'; # à modifier avec
#ton répertoire de test d'abord
while(<FILE>){
/(.*);(.*)/;
print "${rep}${1}.jpg -> ${rep}${2}.jpg\n";
rename("${rep}${1}.jpg","${rep}${2}.jpg");
}
__END__
print 'hello'

et dans l'invite de commande je chope "E:S : no such file or directory". Quelqu'un saurait-il quoi changer ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > Belin
15 juil. 2008 à 15:19
Salut,

essaie avec C en majuscules
my $rep='C:\test'; 
--
106485010510997108
0
Ca n'a rien changé.
Mais, en revenant de manger, ça marche. Je ne cherche même plus, trop peur que ça marche plus :)
En tout cas merci :)
0
Après test plus approfondi, la version pour windows doit être modifiée comme suit :

#!/usr/bin/perl
use strict;use warnings;

open FILE,"Classeur1.csv" or die "E/S : $!\n";

my $rep='C:\test'; # à modifier avec
#ton répertoire de test d'abord
while(<FILE>){
/(.*);(.*)/;
print "${rep}\\${1}.JPG -> ${rep}\\${2}.JPG\n";
rename("${rep}\\${1}.JPG","${rep}\\${2}.JPG");
}
__END__


En effet, on ne peut mettre folder a C:\test\, et si on ne met pas les deux \ avant les nom de fichiers, il cherchera le fichier c:\testmontrucdemacolonne.jpg
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
16 juil. 2008 à 17:02
Salut,

as-tu essayé comme ça

#!/usr/bin/perl # ça c'est pour linux
use strict;use warnings; 

open FILE,"Classeur1.csv" or die "E/S : $!\n"; 

my $rep='C:\test\'; # à modifier avec 
#ton répertoire de test d'abord 
while(<FILE>){ 
/(.*);(.*)/; 
print "${rep}${1}.JPG -> ${rep}${2}.JPG\n"; 
rename("${rep}${1}.JPG","${rep}${2}.JPG&q­uot;); 
} 
__END__ 

0
Ce fut même mon premier réflexe quand j'ai vu qu'il manquait un \, mais il quitte de suite, aloirs quen rajoutant les \\ après ça marche.
0