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 21/04/2015, à 14:30

X4ban

Un script pour renommer mes photos et pour apprendre.

Bonjour a tous,

Je cherche donc désespérément un faire un script pour le renommage en masse de mes photos.

Certes de nombreux logiciels proposent cette fonction, mais tous ceux que j'ai essayé n'avait pas l'option qui m' intéresse, ou en tous cas je n'ai pas su la trouver et/ou l'utiliser, a savoir ajouter un suffixe du type : Vacances_dans_la_pampa_(1 sur 65).jpg.
Et d'autre part j'aimerais profiter de cette occasion pour apprendre a faire des scripts, ou a tout le moins comprendre comment ils fonctionnent.


J'aimerais également introduire des données EXIF, et notamment l'année de la prise de vue,  j'ai trouvé ça qui fonctionne plus ou moins ,je galère avec les espaces dans les noms de fichiers, et je ne maîtrise pas les boucles :

$ exiv2 -r nom_de_fichier-%Y mv 'ancien_nom_de_fichier.jpg'

Et enfin, cerise sur le gâteau, mais ça n'est pas le plus important, si on pouvait renommer le dossier qui contient les photos dans la volée.

Pour résumer :

j'aimerais passer de : Anniversaire_De_Tonton_Maurice_(1).jpg  ==> Anniversaire_De_Tonton_Maurice (1 sur 65) - 2012.jpg
tout ça dans le dossier : Anniversaire_De_Tonton_Maurice En conservant des majuscules sur la première lettre de chaque mot smile.

Et pour finir, si vous aviez la gentillesse d'expliquer les commandes utilisées ou éventuellement fournir un lien qui me permettrait de comprendre ce qui se passe, je vous serais infiniment reconnaissant big_smile.


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#2 Le 22/04/2015, à 01:26

Postmortem

Re : Un script pour renommer mes photos et pour apprendre.

Salut,
Pour l'année, j'ai pas de quoi tester mais voilà déjà pour le renommage en mettant par exemple "(1 sur 65)" pour chaque photo. Tu n'as plus qu'à ajouter ce qu'il faut pour l'année dans la boucle :

#!/bin/bash
cd "/chemin/vers/Anniversaire_De_Tonton_Maurice"
liste_fic=( "Anniversaire_De_Tonton_Maurice_"*.jpg )
nb_photos=${#liste_fic[@]}
for fic in "${liste_fic[@]}"
do
   nouveau_nom=$(sed "s/_\(([^)]*\)/ \1 sur $nb_photos/" <<<"$fic" )
   echo mv -i "$fic" "$nouveau_nom"
done

Si ça te semble ok, il faut enlever "echo" devant la commande "mv" pour faire le renommage.

Il est tard du coup j'ai un peu la flemme pour les explications mais si tu as des questions, je répondrai dès que possible. Ou je ne doute pas que quelqu'un d'autre se fera une joie de le faire !

Dernière modification par Postmortem (Le 22/04/2015, à 01:27)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 22/04/2015, à 03:24

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Salut et merci pour le coup de main smile

Après l'avoir adapté (du moins le crois-je...), j'ai testé rapidement le script (car effectivement il est tard smile ), :

#!/bin/bash

#cd "/chemin/vers/Anniversaire_De_Tonton_Maurice"

liste_fic=( *.jpg )

nb_photos=${#liste_fic[@]}

for fic in "${liste_fic[@]}"

do
   nouveau_nom=$(sed "s/_\(([^)]*\)/ \1 sur $nb_photos/" <<<"$fic" )
   echo mv -i "$fic" "$nouveau_nom"
done

et voila ce qu'il me renvoie :

mv -i juju1.jpg juju1.jpg
mv -i juju2.jpg juju2.jpg
mv -i juju3.jpg juju3.jpg
mv -i juju4.jpg juju4.jpg
mv -i juju5.jpg juju5.jpg
mv -i juju6.jpg juju6.jpg

juju1, juju2, etc étant les noms des fichiers originaux, il ne renomme rien étrangement.

j'ai mis le script dans /home/machin/bin , j'ai donc commenté cette ligne :

#cd "/chemin/vers/Anniversaire_De_Tonton_Maurice"

j'ai modifié celle-ci en pensant qu'il prendrai en compte tous les fichiers .jpg contenu dans le répertoire courant :

liste_fic=( *.jpg )

Voila j’espère que je n'ai pas fait de bêtises hmm , je réessaierai demain, j'y verrai plus clair big_smile

Merci !


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#4 Le 22/04/2015, à 09:28

Postmortem

Re : Un script pour renommer mes photos et pour apprendre.

Dans mon script, la ligne suivante dit de remplacer la 1ère occurence de "_(1" par exemple par " (1 sur 65". Si tes photos n'ont pas le même modèle dans le nom ça fait rien et "nouveau_nom" est égal à "fic" :

nouveau_nom=$(sed "s/_\(([^)]*\)/ \1 sur $nb_photos/" <<<"$fic" )

Je m'étais basé sur l'exemple que tu avais donné.
À la place, on pourrait essayer ça :

liste_fic=( *.jpg )
nb_photos=${#liste_fic[@]}
for fic in "${liste_fic[@]}"
do
   nouveau_nom=$(sed "s/\((\?[0-9]\+\)\()\?\.jpg\)$/\1 sur $nb_photos\2/" <<<"$fic" )
   echo mv -i "$fic" "$nouveau_nom"

done

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 22/04/2015, à 18:44

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Ok je me doutais que c'est ce qui clochais, mais comme je ne maîtrise pas encore la commande sed , cette ligne était totalement obscure pour moi tongue .

En tout cas ça fonctionne maintenant, je vais essayer d’intégrer le renommage par exif et je reviens avec les résultats.

Je me suis rencardé sur sed, mais c'est assez complexe et il va me falloir plus de temps pour la maîtriser, et malheureusement les fichiers que je dois renommer n'ont pas tous le même format.

Si tu trouves (toi ou une bonne âme qui passe par la ^^) le temps pourrais-tu me décortiquer :

nouveau_nom=$(sed "s/_\(([^)]*\)/ \1 sur $nb_photos/" <<<"$fic" )

ou

nouveau_nom=$(sed "s/\((\?[0-9]\+\)\()\?\.jpg\)$/\1 sur $nb_photos\2/" <<<"$fic" )

afin que je puisse l'adapter en fonction des fichiers que je dois traiter.

De mon coté je vais bûcher mais vu que je suis un noob total en programation, je ne suis pas familier avec les fonctions, les commandes, les options, les caractères spéciaux (#"^?\%/$]* au secours), ça risque de me prendre un peu de temps tongue

Merci en tout cas pour ton aide précieuse smile


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#6 Le 22/04/2015, à 22:07

Postmortem

Re : Un script pour renommer mes photos et pour apprendre.

Alors, la syntaxe variable=$(commande) permet d'affecter le résultat de la commande à la variable.
La syntaxe de sed (enfin, une des possibilités ! ) c'est s/expression rationnelle/remplacement/. Ça met donc remplacement à la place de la chaîne qui correspond à l'expression rationnelle.
Dans l'expression rationnelle \((\?[0-9]\+\)\()\?\.jpg\)$ :
\(...\) : permet de faire un regroupement qu'on peut rappeler dans le remplacement par \1 pour le premier regroupement, \2 pour le 2ème etc...
\? : veut dire 0 ou une fois le caractère précédent.
(\? : veut donc dire 0 ou une (
\+ : une ou plusieurs fois le caractère précédent
[0-9] : n'importe quel chiffre entre 0 et 9
[0-9]\+ : veut donc dire un ou plusieurs chiffres
. : ça veut dire n'importe quel caractère
\. : ça veut dire le caractère point (Le \ fait que . n'est pas considéré comme le caractère spécial comme vu juste au dessus)
$ : veut dire fin de la ligne (ou fin du tampon)
L'expression rationnelle \((\?[0-9]\+\)\()\?\.jpg\)$ cherche donc :
   - 0 ou une parenthèse ouvrante suivie d'un ou plusieurs chiffres : on rappellera ce qui est trouvé par \1
   - A la suite, on cherche 0 ou une parenthèse fermante suivie de la chaîne .jpg et cela doit se trouver à la fin de la chaîne qu'on analyse. On rappellera ce qui est trouvé par ce regroupement par \2.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 23/04/2015, à 01:04

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Cool !

J'y vois plus clair !

Merci tout ça est clair et concis, je gagne un temps précieux smile

Toutefois il y a une partie qui m’échappe encore totalement :

<<<

  hmm

Sinon j'ai trouvé ça  pour m'aider a comprendre le reste du script

Bon j'y retourne j'ai du boulot.:D


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#8 Le 23/04/2015, à 08:44

Postmortem

Re : Un script pour renommer mes photos et pour apprendre.

Beaucoup de commandes, comme sed, travaillent sur des fichiers. Ces commandes, à la place de travailler sur un fichier, elles peuvent travailler sur l'entrée standard (qui en fait est un fichier car sur UNIX/Linux tout est fichier).
Quand t'es dans un terminal, l'entrée standard c'est ce que tu saisis au clavier.
En utilisant la syntaxe commande <<<"chaîne de caractères", l'entrée standard de la commande est cette chaîne de caractères, c'est comme si la commande travaillait sur un fichier ne contenant que cette chaîne de caractères.
Il me semble que c'est spécifique à bash, on trouve bcp plus souvent ce genre de syntaxe :

echo "chaîne de caractères" | commande

Lorsqu'on indique pas de fichier à une commande qui habituellement traite les données d'un fichier, le fait de ne pas mettre de nom de fichier fait que la commande va travailler sur son entrée standard et donc, ici, la sortie standard de echo "chaine de caractères" est envoyée sur l'entrée standard de la commande par l'intermédiaire de |.

Pour finir, <<< est en fait un raccourci de ceci :

commande <<FIN_ENTREE
Ici vont des données qui seront
passées sur l'entrée standard
de la commande.
FIN_ENTREE

Tu trouveras des explications sur tout ça dans la partie REDIRECTIONS de man bash


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 02/05/2015, à 02:45

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Bon je suis (presque) parvenu a mes fins :

#!/bin/bash

    read -p 'Nom de fichier : ' nom

    exiv2 -r "${nom^}- %B-%Y " mv -F *.jpg;
      
liste_fic=( *.jpg )
nb_photos=${#liste_fic[@]}
for fic in "${liste_fic[@]}"

do

    nouveau_nom=$(sed "s/\(_\?[0-9]\+\)\(\.jpg\)$/\1 sur $nb_photos\2/" <<<"$fic" )

    mv -i  "$fic" "$nouveau_nom"
      
done

ça me donne ça :

mv -i Noel- décembre-2003 _10.jpg Noel- décembre-2003 _10 sur 65.jpg
mv -i Noel- décembre-2003 _11.jpg Noel- décembre-2003 _11 sur 65.jpg
mv -i Noel- décembre-2003 _12.jpg Noel- décembre-2003 _12 sur 65.jpg

Finalement j'ai opté pour un pré-renommage afin de ne pas avoir a modifier sans cesse la commande sed.
Mais du coup maintenant je chipote un peu : j'aimerais avoir des parenthèses du type (1 sur 65) et pas ce vilain underscore (j'y peux rien j'aime pas les underscores...) et enfin je voudrais capitaliser la 1ere lettre de chaque mot.

Je vais donc tenter ma chance avec sed  smile


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#10 Le 02/05/2015, à 19:43

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Donc je progresse

#!/bin/bash

    read -p 'Nom de fichier : ' nom

    exiv2 -r "${nom^}- %B-%Y " mv -F *.jpg;
      
liste_fic=( *.jpg )
nb_photos=${#liste_fic[@]}
for fic in "${liste_fic[@]}"

do

    

    nouveau_nom=$(sed "s/\(_\?[0-9]\+\)\(\.jpg\)$/\1 sur $nb_photos\2/" <<<"$fic" )

    mv -i  "$fic" "$nouveau_nom"
   
   
done

for f in *.jpg;

do fn=`echo $f | sed 's/_/(/;s/.jpg/ /'`;
    mv "$f" "$fn";
    mv "$fn" "$fn).jpg"
    
    done

Évidement on doit pouvoir faire plus simple hein, mais bon je débute^^ et l'essentiel c'est que ça fonctionne smile
Cependant je suis encore confronté a un problème, c'est un détail, mais lors du numérotage des fichiers via la l'option -F d'exiv2, le premier fichier ne se voit pas attribuer de numéro, ce qui a la fin du script me donne :

Noel- décembre-2003  ).jpg   Noel- décembre-2003 (1 sur 65 ).jpg   Noel- décembre-2003 (2 sur 65 ).jpg  etc...

Donc rien  de dramatique mais si quelqu'un a une solution je suis preneur smile

Bon et ben plus que la capitalisation des premières lettres, j'y retourne tongue


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#11 Le 02/05/2015, à 21:06

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

bon ben voila ça ressemble a peu prés a ce que je voulais big_smile

#!/bin/bash

    read -p 'Nom de fichier : ' nom

    exiv2 -r "${nom^}- %B-%Y " mv -F *.jpg;
      
liste_fic=( *.jpg )
nb_photos=${#liste_fic[@]}
for fic in "${liste_fic[@]}"

do

    

    nouveau_nom=$(sed "s/\(_\?[0-9]\+\)\(\.jpg\)$/\1 sur $nb_photos\2/" <<<"$fic" )

    mv -i  "$fic" "$nouveau_nom"
   
   
done

for f in *.jpg;

do fn=`echo $f | sed 's/_/(/;s/.jpg/ /'`;
    mv "$f" "$fn";
    mv "$fn" "$fn).jpg"
    
    done
    
for f in *.jpg;

      do nf=`echo $f  | sed -r 's/(^.|[ ]+.)/\U&/g'`;
       mv "$f" "$nf"
      
      done

J'ai piqué le dernier bout de code sur le net, j'avoue roll


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne

#12 Le 02/05/2015, à 22:25

X4ban

Re : Un script pour renommer mes photos et pour apprendre.

Bon, une solution entraînant généralement un autre problème(^^), me voila face a des fichiers sans données EXIF, or le script se base en partie sur ces métadatas pour renommer les fichiers.

Heureusement je peux les créer grâce a :

#!/bin/bash

read -p 'Date : ' date

exiftool -overwrite_original -DateTimeOriginal="$date" *.jpg
exiftool -overwrite_original -CreateDate="$date" *.jpg

Question :

Puis-je insérer cela dans mon script sous forme de condition ?
C'est a dire en gros :

1/ Le script vérifie la présence des champs nécessaires dans les données exifs
2/si c'est ok le script continue
3/sinon il va sur la partie ou il me demande la date etc...

Si c'est possible, vers quels outils dois-je me tourner ?


« L'adversaire d'une vraie liberté est un désir excessif de sécurité. »
   Jean de La Fontaine

Hors ligne